1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-26 04:00:43 +03:00

Documentation tidy-up

This commit is contained in:
Graham Nelson 2020-03-22 10:50:19 +00:00
parent c49ce42a2e
commit a693ee4653
499 changed files with 611 additions and 14697 deletions

View file

@ -96,17 +96,17 @@ becomes public: GitHub Pages does not work on private repositories.)
This repository is where development is done on the following executables:
* inform7 - The core compiler in a natural-language design system for interactive fiction. - __version 7.10.1 'Krypton' (build 6Q21)__ - [★ Web](docs/inform7/index.html) - [▶ Documentation](docs/inform7/P-cu.html)
* inform7 - The core compiler in a natural-language design system for interactive fiction. - __version 7.10.1 'Krypton' (build 6Q21)__ - [★ Web](docs/inform7/index.html) - [▶ Documentation](docs/inform7/M-cu.html)
* its modules [★ inflections](docs/inflections-module/index.html), [★ problems](docs/problems-module/index.html), [★ linguistics](docs/linguistics-module/index.html), [★ kinds](docs/kinds-module/index.html), [★ core](docs/core-module/index.html), [★ if](docs/if-module/index.html), [★ multimedia](docs/multimedia-module/index.html), [★ index](docs/index-module/index.html)
* their unit test executables [★ inflections-test](docs/inflections-test/index.html), [★ problems-test](docs/problems-test/index.html), [★ linguistics-test](docs/linguistics-test/index.html), [★ kinds-test](docs/kinds-test/index.html)
* inblorb - The packaging stage of the Inform 7 system, which releases a story file in the blorbed format. - __version 4 'Duralumin'__ - [★ Web](docs/inblorb/index.html) - [▶ Documentation](docs/inblorb/P-ui.html)
* inbuild - A simple build and package manager for the Inform tools. - __version 1 'Avignon'__ - [★ Web](docs/inbuild/index.html) - [▶ Documentation](docs/inbuild/P-ui.html)
* inblorb - The packaging stage of the Inform 7 system, which releases a story file in the blorbed format. - __version 4 'Duralumin'__ - [★ Web](docs/inblorb/index.html) - [▶ Documentation](docs/inblorb/M-ui.html)
* inbuild - A simple build and package manager for the Inform tools. - __version 1 'Avignon'__ - [★ Web](docs/inbuild/index.html) - [▶ Documentation](docs/inbuild/M-ui.html)
* its modules [★ inbuild](docs/inbuild-module/index.html), [★ arch](docs/arch-module/index.html), [★ html](docs/html-module/index.html), [★ words](docs/words-module/index.html), [★ syntax](docs/syntax-module/index.html)
* two unit test executables [★ words-test](docs/words-test/index.html), [★ syntax-test](docs/syntax-test/index.html)
* indoc - The documentation-formatter for the Inform 7 system. - __version 4 'Didache'__ - [★ Web](docs/indoc/index.html) - [▶ Documentation](docs/indoc/P-iti.html)
* inpolicy - A lint-like tool to check up on various policies used in Inform source code. - __version 1 'Plan A'__ - [★ Web](docs/inpolicy/index.html) - [▶ Documentation](docs/inpolicy/P-ui.html)
* inrtps - A generator of HTML pages to show for run-time problem messages in Inform. - __version 2 'Benefactive'__ - [★ Web](docs/inrtps/index.html) - [▶ Documentation](docs/inrtps/P-ui.html)
* inter - For handling intermediate Inform code. - __version 1 'Axion'__ - [★ Web](docs/inter/index.html) - [▶ Documentation](docs/inter/P-ui.html)
* indoc - The documentation-formatter for the Inform 7 system. - __version 4 'Didache'__ - [★ Web](docs/indoc/index.html) - [▶ Documentation](docs/indoc/M-iti.html)
* inpolicy - A lint-like tool to check up on various policies used in Inform source code. - __version 1 'Plan A'__ - [★ Web](docs/inpolicy/index.html) - [▶ Documentation](docs/inpolicy/M-ui.html)
* inrtps - A generator of HTML pages to show for run-time problem messages in Inform. - __version 2 'Benefactive'__ - [★ Web](docs/inrtps/index.html) - [▶ Documentation](docs/inrtps/M-ui.html)
* inter - For handling intermediate Inform code. - __version 1 'Axion'__ - [★ Web](docs/inter/index.html) - [▶ Documentation](docs/inter/M-ui.html)
* its modules [★ inter](docs/inter-module/index.html), [★ codegen](docs/codegen-module/index.html)
Two webs give detailed expositions of the most important built-in Inform extensions (at the subtree inform7/extensions):

View file

@ -1,857 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>S/rt2</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of 'S/lt2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">BasicInformKit</a></li><li><b>Lists Template</b></li></ul><p class="purpose">Code to support the list of... kind of value constructor.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Block Format</a></li><li><a href="#SP2">&#167;2. KOV Support</a></li><li><a href="#SP3">&#167;3. Creation</a></li><li><a href="#SP4">&#167;4. Destruction</a></li><li><a href="#SP5">&#167;5. Copying</a></li><li><a href="#SP6">&#167;6. Comparison</a></li><li><a href="#SP7">&#167;7. Hashing</a></li><li><a href="#SP8">&#167;8. Printing</a></li><li><a href="#SP9">&#167;9. List From Description</a></li><li><a href="#SP10">&#167;10. Find Item</a></li><li><a href="#SP11">&#167;11. Insert Item</a></li><li><a href="#SP12">&#167;12. Append List</a></li><li><a href="#SP13">&#167;13. Remove Value</a></li><li><a href="#SP14">&#167;14. Remove Item Range</a></li><li><a href="#SP15">&#167;15. Remove List</a></li><li><a href="#SP16">&#167;16. Get Length</a></li><li><a href="#SP17">&#167;17. Set Length</a></li><li><a href="#SP18">&#167;18. Get Item</a></li><li><a href="#SP19">&#167;19. Write Item</a></li><li><a href="#SP20">&#167;20. Put Item</a></li><li><a href="#SP21">&#167;21. Reversing</a></li><li><a href="#SP22">&#167;22. Rotation</a></li><li><a href="#SP23">&#167;23. Sorting</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Block Format. </b>A list is a variable-length array of values all of which have the same kind.
(Compare a combination, a fixed-length array of values with possibly
different kinds.) The short block for a list is a pointer to the long
block. The long block consists of the strong kind ID of the items
(not of the list itself!), followed by the number of items, followed
by one word for each item.
</p>
<pre class="display">
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment">! The kind of the items</span>
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">LIST_LENGTH_F</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="comment">! The number of items</span>
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">; </span><span class="comment">! List items begin at this entry</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. KOV Support. </b>See the "BlockValues.i6t" segment for the specification of the following
routines.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Support</span><span class="plain"> </span><span class="identifier">task</span><span class="plain"> </span><span class="identifier">arg1</span><span class="plain"> </span><span class="identifier">arg2</span><span class="plain"> </span><span class="identifier">arg3</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">task</span><span class="plain">) {</span>
<span class="identifier">CREATE_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">LIST_OF_TY_Create</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">arg2</span><span class="plain">);</span>
<span class="identifier">DESTROY_KOVS</span><span class="plain">: </span><span class="identifier">LIST_OF_TY_Destroy</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">);</span>
<span class="identifier">MAKEMUTABLE_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">COPYKIND_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">LIST_OF_TY_CopyKind</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">arg2</span><span class="plain">);</span>
<span class="identifier">COPYQUICK_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">LIST_OF_TY_QuickCopy</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">arg2</span><span class="plain">);</span>
<span class="identifier">COPYSB_KOVS</span><span class="plain">: </span><span class="identifier">BlkValueCopySB1</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">arg2</span><span class="plain">);</span>
<span class="identifier">KINDDATA_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">LIST_OF_TY_KindData</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">arg2</span><span class="plain">);</span>
<span class="identifier">EXTENT_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">) + </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">;</span>
<span class="identifier">COPY_KOVS</span><span class="plain">: </span><span class="identifier">LIST_OF_TY_Copy</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">arg2</span><span class="plain">, </span><span class="identifier">arg3</span><span class="plain">);</span>
<span class="identifier">COMPARE_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">LIST_OF_TY_Compare</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">arg2</span><span class="plain">);</span>
<span class="identifier">HASH_KOVS</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">LIST_OF_TY_Hash</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">);</span>
<span class="identifier">DEBUG_KOVS</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" = {"</span><span class="plain">, (</span><span class="identifier">LIST_OF_TY_Say</span><span class="plain">) </span><span class="identifier">arg1</span><span class="plain">, </span><span class="string">"} of kind "</span><span class="plain">,</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">arg1</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="comment">! We choose not to respond to: CAST_KOVS, READ_FILE_KOVS, WRITE_FILE_KOVS</span>
<span class="reserved">rfalse</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Creation. </b>Lists are by default created empty but in a block-value with enough capacity
to hold 25 items, this being what's left in a 32-word block once all overheads
are taken care of: 4 words are consumed by the header, then 2 more by the
list metadata entries below.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Create</span><span class="plain"> </span><span class="identifier">skov</span><span class="plain"> </span><span class="identifier">sb</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="identifier">skov</span><span class="plain"> = </span><span class="identifier">KindBaseTerm</span><span class="plain">(</span><span class="identifier">skov</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="identifier">list</span><span class="plain"> = </span><span class="identifier">FlexAllocate</span><span class="plain">(27*</span><span class="identifier">WORDSIZE</span><span class="plain">, </span><span class="identifier">LIST_OF_TY</span><span class="plain">, </span><span class="identifier">BLK_FLAG_MULTIPLE</span><span class="plain"> + </span><span class="identifier">BLK_FLAG_WORD</span><span class="plain">);</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">, </span><span class="identifier">skov</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
<span class="identifier">sb</span><span class="plain"> = </span><span class="identifier">BlkValueCreateSB1</span><span class="plain">(</span><span class="identifier">sb</span><span class="plain">, </span><span class="identifier">list</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">sb</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Destruction. </b>If the list items are themselves block-values, they must all be freed before
the list itself can be freed.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Destroy</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">;</span>
<span class="identifier">k</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">)) {</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">BlkValueFree</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Copying. </b>Again, if the list contains block-values then they must be duplicated rather
than bitwise copied as pointers.
</p>
<p class="inwebparagraph">Note that we use the pre-copy stage to remember the kind of value stored
in the list. Type-checking will make sure this isn't abused: cases where
it's important include copying the empty list into a list of rooms (it
should not as a result acquire the kind "list of values"), or copying
a list of people into a list of things (which should remain a list of
things.)
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_CopyKind</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">;</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="reserved">to</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">, </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">));</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_QuickCopy</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="reserved">to</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">) ~= </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">))</span>
<span class="reserved">rfalse</span><span class="plain">;</span>
<span class="reserved">rtrue</span><span class="plain">;</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_KindData</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">);</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Copy</span><span class="plain"> </span><span class="identifier">lto</span><span class="plain"> </span><span class="identifier">lfrom</span><span class="plain"> </span><span class="identifier">precopied_list_kov</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">nv</span><span class="plain"> </span><span class="identifier">bk</span><span class="plain"> </span><span class="identifier">val</span><span class="plain"> </span><span class="identifier">splk</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">lfrom</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="identifier">bk</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">lfrom</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">precopied_list_kov</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">UNKNOWN_TY</span><span class="plain">)</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">lto</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">, </span><span class="identifier">precopied_list_kov</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">lto</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">, </span><span class="identifier">bk</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">bk</span><span class="plain">)) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">val</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">lfrom</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">precopied_list_kov</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">UNKNOWN_TY</span><span class="plain">)</span>
<span class="identifier">nv</span><span class="plain"> = </span><span class="identifier">BlkValueCreate</span><span class="plain">(</span><span class="identifier">precopied_list_kov</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">nv</span><span class="plain"> = </span><span class="identifier">BlkValueCreate</span><span class="plain">(</span><span class="identifier">bk</span><span class="plain">);</span>
<span class="identifier">BlkValueCopy</span><span class="plain">(</span><span class="identifier">nv</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">lto</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">, </span><span class="identifier">nv</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Comparison. </b>Lists of a given kind of value are always grouped together, in this comparison:
but the effect of that is unlikely to be noticed since NI's type-checker will
probably prevent comparisons of lists of differing items in any case. The
next criterion is length: a short list precedes a long one. Beyond that, we
use the list's own preferred comparison function to judge the items in turn,
stopping as soon as a pair of corresponding items differs: thus we sort
lists of equal size in lexicographic order.
</p>
<p class="inwebparagraph">Since the comparison function depends only on the KOV, it may seem wasteful
of a word of memory to store it in the list, given that we are already storing
the KOV in any case. But we do this because comparisons have to be fast: we
don't want to incur the overhead of translating KOV to comparison function.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Compare</span><span class="plain"> </span><span class="identifier">listleft</span><span class="plain"> </span><span class="identifier">listright</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">cf</span><span class="plain">;</span>
<span class="identifier">delta</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">listleft</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">) </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">listright</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">delta</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">listleft</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">delta</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">listleft</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">) </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">listright</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">delta</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain">;</span>
<span class="identifier">cf</span><span class="plain"> = </span><span class="identifier">LIST_OF_TY_ComparisonFn</span><span class="plain">(</span><span class="identifier">listleft</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cf</span><span class="plain"> == </span><span class="constant">0</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">UnsignedCompare</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">delta</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">listleft</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">) </span><span class="constant">-</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">listright</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">delta</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">delta</span><span class="plain"> = </span><span class="identifier">cf</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">listleft</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">),</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">listright</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">delta</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">delta</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_ComparisonFn</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">KOVComparisonFunction</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">));</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Distinguish</span><span class="plain"> </span><span class="identifier">txb1</span><span class="plain"> </span><span class="identifier">txb2</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LIST_OF_TY_Compare</span><span class="plain">(</span><span class="identifier">txb1</span><span class="plain">, </span><span class="identifier">txb2</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="reserved">rtrue</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Hashing. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Hash</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">len</span><span class="plain"> </span><span class="identifier">kov</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">len</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="identifier">kov</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">len</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">rv</span><span class="plain"> * </span><span class="constant">33</span><span class="plain"> + </span><span class="identifier">GetHashValue</span><span class="plain">(</span><span class="identifier">kov</span><span class="plain">, </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Printing. </b>Unusually, this function can print the value in one of several formats:
0 for a comma-separated list; 1 for a braced, set-notation list; 2 for
a comma-separated list with definite articles, which only makes sense if
the list contains objects; 3 for a comma-separated list with indefinite
articles. Note that a list in this sense is not printed using the
"ListWriter.i6t" code for elaborate lists of objects, and it doesn't
use the "listing contents of..." activity in any circumstances.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Say</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">format</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">bk</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="identifier">bk</span><span class="plain"> = </span><span class="identifier">KindAtomic</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">));</span>
<span class="comment">! print no_items, " of kov=", BlkValueRead(list, LIST_ITEM_KOV_F), ":";</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">format</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"{"</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0:</span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">format</span><span class="plain">) {</span>
<span class="constant">2</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> (</span><span class="identifier">the</span><span class="plain">) </span><span class="identifier">v</span><span class="plain">;</span>
<span class="constant">3</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain">) </span><span class="identifier">v</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bk</span><span class="plain"> == </span><span class="identifier">LIST_OF_TY</span><span class="plain">) </span><span class="identifier">LIST_OF_TY_Say</span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bk</span><span class="plain"> == </span><span class="identifier">TEXT_TY</span><span class="plain">) &amp;&amp; (</span><span class="identifier">format</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">)) {</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"~"</span><span class="plain">; </span><span class="identifier">PrintKindValuePair</span><span class="plain">(</span><span class="identifier">bk</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">); </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"~"</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PrintKindValuePair</span><span class="plain">(</span><span class="identifier">bk</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">-2) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">", "</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">==</span><span class="identifier">no_items</span><span class="plain">-2) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">format</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">", "</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TEMPLATE_CONFIGURATION_BITMAP</span><span class="plain"> &amp; </span><span class="identifier">SERIAL_COMMA_TCBIT</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain"> ~= </span><span class="constant">2</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">","</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'C'</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">format</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"}"</span><span class="plain">;</span>
<span class="identifier">prior_named_list</span><span class="plain"> = </span><span class="identifier">no_items</span><span class="plain">; </span><span class="identifier">prior_named_list_gender</span><span class="plain"> = </span><span class="constant">-1</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. List From Description. </b>That completes the compulsory services required for this KOV to function:
from here on, the remaining routines provide definitions of stored action-related
phrases in the Standard Rules.
</p>
<p class="inwebparagraph">Given a description <code class="display"><span class="extract">D</span></code> which applies to some objects and not others &mdash;
say, "lighted rooms adjacent to the Transport Hub" &mdash; we can cast this
into a list of all objects satisfying <code class="display"><span class="extract">D</span></code> with the following routine.
Slightly wastefully of time, we have to iterate through the objects
twice in order first to work out the length of list we will need, and
then to transcribe them.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Desc</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">desc</span><span class="plain"> </span><span class="identifier">kov</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">ex</span><span class="plain"> </span><span class="identifier">len</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">false</span><span class="plain">;</span>
<span class="identifier">ex</span><span class="plain"> = </span><span class="identifier">BlkValueLBCapacity</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">);</span>
<span class="identifier">len</span><span class="plain"> = </span><span class="identifier">desc</span><span class="plain">(-3);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">len</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain"> &gt; </span><span class="identifier">ex</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BlkValueSetLBCapacity</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">len</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">) == </span><span class="reserved">false</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kov</span><span class="plain">) </span><span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">, </span><span class="identifier">kov</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">, </span><span class="identifier">OBJECT_TY</span><span class="plain">);</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="identifier">len</span><span class="plain">);</span>
<span class="identifier">obj</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">len</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">obj</span><span class="plain"> = </span><span class="identifier">desc</span><span class="plain">(-2, </span><span class="identifier">obj</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="comment">! print "i = ", i, " and obj = ", obj, "^";</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">, </span><span class="identifier">obj</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Find Item. </b>We test whether a list <code class="display"><span class="extract">list</span></code> includes a value equal to <code class="display"><span class="extract">v</span></code> or not. Equality
here is in the sense of the list's comparison function: thus for texts or
other lists, say, deep comparisons rather than simple pointer comparisons are
performed. In other words, one copy of "Alert" is equal to another.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_FindItem</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">cf</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="identifier">cf</span><span class="plain"> = </span><span class="identifier">LIST_OF_TY_ComparisonFn</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">);</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cf</span><span class="plain"> == </span><span class="constant">0</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">UnsignedCompare</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">v</span><span class="plain"> == </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">)) </span><span class="reserved">rtrue</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cf</span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">)) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">rtrue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">rfalse</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Insert Item. </b>The following routine inserts an item into the list. If this would break
the size of the current block-value, then we extend by at least enough room
to hold at least another 16 entries.
</p>
<p class="inwebparagraph">In the call <code class="display"><span class="extract">LIST_OF_TY_InsertItem(list, v, posnflag, posn, nodups)</span></code>, only
the first two arguments are compulsory.
</p>
<ul class="items"><li>(a) If <code class="display"><span class="extract">nodups</span></code> is set, and an item equal to <code class="display"><span class="extract">v</span></code> is already present in the
list, we return and do nothing. (<code class="display"><span class="extract">nodups</span></code> means "no duplicates".)
</li><li>(b) Otherwise, if <code class="display"><span class="extract">posnflag</span></code> is <code class="display"><span class="extract">false</span></code>, we append a new entry <code class="display"><span class="extract">v</span></code> at the
back of the given <code class="display"><span class="extract">list</span></code>.
</li><li>(c) Otherwise, when <code class="display"><span class="extract">posnflag</span></code> is <code class="display"><span class="extract">true</span></code>, <code class="display"><span class="extract">posn</span></code> indicates the insertion
position, from 1 (before the current first item) to N+1 (after the last),
where N is the number of items in the list at present.
</li></ul>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_InsertItem</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> </span><span class="identifier">posnflag</span><span class="plain"> </span><span class="identifier">posn</span><span class="plain"> </span><span class="identifier">nodups</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">ex</span><span class="plain"> </span><span class="identifier">nv</span><span class="plain"> </span><span class="identifier">contents_kind</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">false</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nodups</span><span class="plain"> &amp;&amp; (</span><span class="identifier">LIST_OF_TY_FindItem</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">); </span><span class="comment">! Forces the list to be mutable</span>
<span class="identifier">contents_kind</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">posnflag</span><span class="plain">) &amp;&amp; ((</span><span class="identifier">posn</span><span class="plain">&lt;1) || (</span><span class="identifier">posn</span><span class="plain"> &gt; </span><span class="identifier">no_items</span><span class="plain">+1))) {</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"*** Couldn't add at entry "</span><span class="plain">, </span><span class="identifier">posn</span><span class="plain">, </span><span class="string">" in the list "</span><span class="plain">;</span>
<span class="identifier">LIST_OF_TY_Say</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">", which has entries in the range 1 to "</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">, </span><span class="string">" ***^"</span><span class="plain">;</span>
<span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_LISTRANGEERROR</span><span class="plain">);</span>
<span class="reserved">rfalse</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">ex</span><span class="plain"> = </span><span class="identifier">BlkValueLBCapacity</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+1 &gt; </span><span class="identifier">ex</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BlkValueSetLBCapacity</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">ex</span><span class="plain">+16) == </span><span class="reserved">false</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">contents_kind</span><span class="plain">)) {</span>
<span class="identifier">nv</span><span class="plain"> = </span><span class="identifier">BlkValueCreate</span><span class="plain">(</span><span class="identifier">contents_kind</span><span class="plain">);</span>
<span class="identifier">BlkValueCopy</span><span class="plain">(</span><span class="identifier">nv</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">nv</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">posnflag</span><span class="plain">) {</span>
<span class="identifier">posn</span><span class="plain">--;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">no_items</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">&gt;</span><span class="identifier">posn</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">--) {</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">,</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-1+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">posn</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">+1);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Append List. </b>Instead of adjoining a single value, we adjoin an entire second list, which
must be of a compatible kind of value (something which NI's type-checking
machinery polices for us). Except that we have a list <code class="display"><span class="extract">more</span></code> rather than a
value <code class="display"><span class="extract">v</span></code> to insert, the specification is the same as for
<code class="display"><span class="extract">LIST_OF_TY_InsertItem</span></code>.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_AppendList</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">more</span><span class="plain"> </span><span class="identifier">posnflag</span><span class="plain"> </span><span class="identifier">posn</span><span class="plain"> </span><span class="identifier">nodups</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">msize</span><span class="plain"> </span><span class="identifier">ex</span><span class="plain"> </span><span class="identifier">nv</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">false</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">more</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">more</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">); </span><span class="comment">! Forces the list to be mutable</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">posnflag</span><span class="plain">) &amp;&amp; ((</span><span class="identifier">posn</span><span class="plain">&lt;1) || (</span><span class="identifier">posn</span><span class="plain"> &gt; </span><span class="identifier">no_items</span><span class="plain">+1))) {</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"*** Couldn't add at entry "</span><span class="plain">, </span><span class="identifier">posn</span><span class="plain">, </span><span class="string">" in the list "</span><span class="plain">;</span>
<span class="identifier">LIST_OF_TY_Say</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">", which has entries in the range 1 to "</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">, </span><span class="string">" ***^"</span><span class="plain">;</span>
<span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_LISTRANGEERROR</span><span class="plain">);</span>
<span class="reserved">rfalse</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">msize</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">more</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="identifier">ex</span><span class="plain"> = </span><span class="identifier">BlkValueLBCapacity</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain">+</span><span class="identifier">msize</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain"> &gt; </span><span class="identifier">ex</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BlkValueSetLBCapacity</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">+</span><span class="identifier">msize</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+8) == </span><span class="reserved">false</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">posnflag</span><span class="plain">) {</span>
<span class="identifier">posn</span><span class="plain">--;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">no_items</span><span class="plain">+</span><span class="identifier">msize</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">&gt;=</span><span class="identifier">posn</span><span class="plain">+</span><span class="identifier">msize</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">--) {</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">,</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-</span><span class="identifier">msize</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="comment">! BlkValueWrite(list, posn, v);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">=0: </span><span class="identifier">j</span><span class="plain">&lt;</span><span class="identifier">msize</span><span class="plain">: </span><span class="identifier">j</span><span class="plain">++) {</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">more</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">))) {</span>
<span class="identifier">nv</span><span class="plain"> = </span><span class="identifier">BlkValueCreate</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">));</span>
<span class="identifier">BlkValueCopy</span><span class="plain">(</span><span class="identifier">nv</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">nv</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">posn</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0, </span><span class="identifier">j</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">msize</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">more</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">))) {</span>
<span class="identifier">nv</span><span class="plain"> = </span><span class="identifier">BlkValueCreate</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">));</span>
<span class="identifier">BlkValueCopy</span><span class="plain">(</span><span class="identifier">nv</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">nv</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">nodups</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">LIST_OF_TY_FindItem</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">) == </span><span class="reserved">false</span><span class="plain">)) {</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="identifier">j</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Remove Value. </b>We remove every instance of the value <code class="display"><span class="extract">v</span></code> from the given <code class="display"><span class="extract">list</span></code>. If the
optional flag <code class="display"><span class="extract">forgive</span></code> is set, then we make no complaint if no value of
<code class="display"><span class="extract">v</span></code> was present in the first place: otherwise, we issue a run-time problem.
</p>
<p class="inwebparagraph">Note that if the list contains block-values then the value must be properly
destroyed with <code class="display"><span class="extract">BlkValueFree</span></code> before being overwritten as the items shuffle down.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_RemoveValue</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> </span><span class="identifier">forgive</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">odsize</span><span class="plain"> </span><span class="identifier">f</span><span class="plain"> </span><span class="identifier">cf</span><span class="plain"> </span><span class="identifier">delendum</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="identifier">cf</span><span class="plain"> = </span><span class="identifier">LIST_OF_TY_ComparisonFn</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">);</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">); </span><span class="identifier">odsize</span><span class="plain"> = </span><span class="identifier">no_items</span><span class="plain">;</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">); </span><span class="comment">! Forces the list to be mutable</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">delendum</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cf</span><span class="plain"> == </span><span class="constant">0</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">UnsignedCompare</span><span class="plain">)</span>
<span class="identifier">f</span><span class="plain"> = (</span><span class="identifier">v</span><span class="plain"> == </span><span class="identifier">delendum</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">f</span><span class="plain"> = (</span><span class="identifier">cf</span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">delendum</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">)))</span>
<span class="identifier">BlkValueFree</span><span class="plain">(</span><span class="identifier">delendum</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">+1: </span><span class="identifier">j</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">j</span><span class="plain">++)</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">-1+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">,</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">));</span>
<span class="identifier">no_items</span><span class="plain">--; </span><span class="identifier">i</span><span class="plain">--;</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">odsize</span><span class="plain"> ~= </span><span class="identifier">no_items</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">forgive</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"*** Couldn't remove: the value "</span><span class="plain">;</span>
<span class="identifier">PrintKindValuePair</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">), </span><span class="identifier">v</span><span class="plain">);</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">" was not present in the list "</span><span class="plain">;</span>
<span class="identifier">LIST_OF_TY_Say</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">" ***^"</span><span class="plain">;</span>
<span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_LISTRANGEERROR</span><span class="plain">);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Remove Item Range. </b>We excise items <code class="display"><span class="extract">from</span></code> to <code class="display"><span class="extract">to</span></code> from the given <code class="display"><span class="extract">list</span></code>, which numbers its items
upwards from 1. If the optional flag <code class="display"><span class="extract">forgive</span></code> is set, then we truncate a range
overspilling the actual list, and we make no complaint if it turns out that
there is then nothing to be done: otherwise, in either event, we issue a
run-time problem.
</p>
<p class="inwebparagraph">Once again, we destroy any block-values whose pointers will be overwritten
as the list shuffles down to fill the void.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_RemoveItemRange</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">forgive</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain"> &gt; </span><span class="reserved">to</span><span class="plain">) || (</span><span class="identifier">from</span><span class="plain"> &lt;= </span><span class="constant">0</span><span class="plain">) || (</span><span class="reserved">to</span><span class="plain"> &gt; </span><span class="identifier">no_items</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">forgive</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain"> &lt;= </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">from</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="reserved">to</span><span class="plain"> &gt;= </span><span class="identifier">no_items</span><span class="plain">) </span><span class="reserved">to</span><span class="plain"> = </span><span class="identifier">no_items</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain"> &gt; </span><span class="reserved">to</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"*** Couldn't remove entries "</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">, </span><span class="string">" to "</span><span class="plain">, </span><span class="reserved">to</span><span class="plain">, </span><span class="string">" from the list "</span><span class="plain">;</span>
<span class="identifier">LIST_OF_TY_Say</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">", which has entries in the range 1 to "</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">, </span><span class="string">" ***^"</span><span class="plain">;</span>
<span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_LISTRANGEERROR</span><span class="plain">);</span>
<span class="reserved">rfalse</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">to</span><span class="plain">--; </span><span class="identifier">from</span><span class="plain">--;</span>
<span class="identifier">d</span><span class="plain"> = </span><span class="reserved">to</span><span class="plain">-</span><span class="identifier">from</span><span class="plain">+1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">)))</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">d</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">BlkValueFree</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">));</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">from</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">-</span><span class="identifier">d</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">,</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">d</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">));</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">-</span><span class="identifier">d</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Remove List. </b>We excise all values from the removal list <code class="display"><span class="extract">rlist</span></code>, wherever they occur in
<code class="display"><span class="extract">list</span></code>. Inevitably, given that we haven't sorted these lists and can spare
neither time nor storage to do so, this is an expensive process with a
running time proportional to the product of the two list sizes: we accept
that as an overhead because in practice the <code class="display"><span class="extract">rlist</span></code> is almost always small
in real-world use.
</p>
<p class="inwebparagraph">If the initial lists were disjoint, so that no removals occur, we always
forgive the user: the request was not necessarily a foolish one, it only
happened in this situation to be unhelpful.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Remove_List</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">rlist</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> </span><span class="identifier">w</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">odsize</span><span class="plain"> </span><span class="identifier">rsize</span><span class="plain"> </span><span class="identifier">cf</span><span class="plain"> </span><span class="identifier">f</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">); </span><span class="identifier">odsize</span><span class="plain"> = </span><span class="identifier">no_items</span><span class="plain">;</span>
<span class="identifier">rsize</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">rlist</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="identifier">cf</span><span class="plain"> = </span><span class="identifier">LIST_OF_TY_ComparisonFn</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain">=0: </span><span class="identifier">k</span><span class="plain">&lt;</span><span class="identifier">rsize</span><span class="plain">: </span><span class="identifier">k</span><span class="plain">++) {</span>
<span class="identifier">w</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">rlist</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cf</span><span class="plain"> == </span><span class="constant">0</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">UnsignedCompare</span><span class="plain">)</span>
<span class="identifier">f</span><span class="plain"> = (</span><span class="identifier">v</span><span class="plain"> == </span><span class="identifier">w</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">f</span><span class="plain"> = (</span><span class="identifier">cf</span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">w</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">)))</span>
<span class="identifier">BlkValueFree</span><span class="plain">(</span><span class="identifier">v</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">+1: </span><span class="identifier">j</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">j</span><span class="plain">++)</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">-1,</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">));</span>
<span class="identifier">no_items</span><span class="plain">--; </span><span class="identifier">i</span><span class="plain">--;</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">rfalse</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. Get Length. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_GetLength</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Empty</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">rtrue</span><span class="plain">;</span>
<span class="reserved">rfalse</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. Set Length. </b>This is rather harder: it might lengthen the list, in which case we
have to pad out with the default value for the kind of value stored &mdash;
padding a list of numbers with 0s, a list of texts with copies of the
empty text, and so on &mdash; creating such block-values as might be needed;
or else it might shorten the list, in which case we must cut items,
destroying them properly if they were block-values.
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">LIST_OF_TY_SetLength(list, newsize, this_way_only, truncation_end)</span></code>
alters the length of the given <code class="display"><span class="extract">list</span></code> to <code class="display"><span class="extract">newsize</span></code>. If <code class="display"><span class="extract">this_way_only</span></code> is 1,
the list is only allowed to grow, and nothing happens if we have asked to
shrink it; if it is -1, the list is only allowed to shrink; if it is 0,
the list is allowed either to grow or shrink. In the event that the list
does have to shrink, entries must be removed, and we remove from the end
if <code class="display"><span class="extract">truncation_end</span></code> is 1, or from the start if it is -1.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_SetLength</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">newsize</span><span class="plain"> </span><span class="identifier">this_way_only</span><span class="plain"> </span><span class="identifier">truncation_end</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">ex</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">dv</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">newsize</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_LISTSIZENEGATIVE</span><span class="plain">, </span><span class="identifier">newsize</span><span class="plain">);</span>
<span class="identifier">BlkMakeMutable</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">);</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain"> &lt; </span><span class="identifier">newsize</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this_way_only</span><span class="plain"> == </span><span class="constant">-1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="identifier">ex</span><span class="plain"> = </span><span class="identifier">BlkValueLBCapacity</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">newsize</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain"> &gt; </span><span class="identifier">ex</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BlkValueSetLBCapacity</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">newsize</span><span class="plain">+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">) == </span><span class="reserved">false</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">dv</span><span class="plain"> = </span><span class="identifier">DefaultValueOfKOV</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">));</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">newsize</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">dv</span><span class="plain">);</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="identifier">newsize</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain"> &gt; </span><span class="identifier">newsize</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this_way_only</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">truncation_end</span><span class="plain"> == </span><span class="constant">-1</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">)))</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">-</span><span class="identifier">newsize</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">BlkValueFree</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">));</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">newsize</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">,</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">no_items</span><span class="plain">-</span><span class="identifier">newsize</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">));</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">)))</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">newsize</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">BlkValueFree</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">, </span><span class="identifier">newsize</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. Get Item. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_GetItem</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">forgive</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">false</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain">&lt;=0) || (</span><span class="identifier">i</span><span class="plain">&gt;</span><span class="identifier">no_items</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">forgive</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">false</span><span class="plain">;</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"*** Couldn't read from entry "</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="string">" of a list which"</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain">) {</span>
<span class="constant">0</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" is empty ***^"</span><span class="plain">;</span>
<span class="constant">1</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" has only one entry, numbered 1 ***^"</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" has entries numbered from 1 to "</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">, </span><span class="string">" ***^"</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_LISTRANGEERROR</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain"> &gt;= </span><span class="constant">1</span><span class="plain">) </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">false</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">-1);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. Write Item. </b>The slightly odd name for this function comes about because our usual way
to convert an rvalue such as <code class="display"><span class="extract">LIST_OF_TY_GetItem(L, 4)</span></code> is to prefix
<code class="display"><span class="extract">Write</span></code>, so that it becomes <code class="display"><span class="extract">WriteLIST_OF_TY_GetItem(L, 4)</span></code>.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">WriteLIST_OF_TY_GetItem</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">val</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">false</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain">&lt;=0) || (</span><span class="identifier">i</span><span class="plain">&gt;</span><span class="identifier">no_items</span><span class="plain">)) {</span>
<span class="reserved">print</span><span class="plain"> </span><span class="string">"*** Couldn't write to list entry "</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="string">" of a list which"</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain">) {</span>
<span class="constant">0</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" is empty ***^"</span><span class="plain">;</span>
<span class="constant">1</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" has only one entry, numbered 1 ***^"</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" has entries numbered from 1 to "</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">, </span><span class="string">" ***^"</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_LISTRANGEERROR</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">-1, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. Put Item. </b>Higher-level code should not use <code class="display"><span class="extract">Write_LIST_OF_TY_GetItem</span></code>, because it does
not properly keep track of block-value copying: the following should be
used instead.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_PutItem</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">nv</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">false</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">KOVIsBlockValue</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">))) {</span>
<span class="identifier">nv</span><span class="plain"> = </span><span class="identifier">BlkValueCreate</span><span class="plain">(</span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_KOV_F</span><span class="plain">));</span>
<span class="identifier">BlkValueCopy</span><span class="plain">(</span><span class="identifier">nv</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">nv</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain">&lt;=0) || (</span><span class="identifier">i</span><span class="plain">&gt;</span><span class="identifier">no_items</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">false</span><span class="plain">;</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">-1, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. Reversing. </b>Reversing a list is, happily, a very efficient operation when the list contains
block-values: because the pointers are rearranged but none is duplicated or
destroyed, we can for once ignore the fact that they are pointers to
block-values and simply move them around like any other data.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Reverse</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain"> &lt; </span><span class="constant">2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0:</span><span class="identifier">i</span><span class="plain">*2&lt;</span><span class="identifier">no_items</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">,</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">no_items</span><span class="plain">-1-</span><span class="identifier">i</span><span class="plain">));</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">no_items</span><span class="plain">-1-</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. Rotation. </b>The same is true of rotation. Here, "forwards" rotation means towards the
end of the list, "backwards" means towards the start.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Rotate</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">backwards</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list</span><span class="plain">==0) || (</span><span class="identifier">BlkValueWeakKind</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">) ~= </span><span class="identifier">LIST_OF_TY</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain"> &lt; </span><span class="constant">2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">backwards</span><span class="plain">) {</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0:</span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">-1:</span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">,</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">+1));</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">-1+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">-1+</span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">no_items</span><span class="plain">-1:</span><span class="identifier">i</span><span class="plain">&gt;0:</span><span class="identifier">i</span><span class="plain">--)</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">,</span>
<span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">-1));</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. Sorting. </b>And the same, again, is true of sorting: but we do have to take note of block
values when it comes to performing comparisons, because we can only compare
items in the list by looking at their contents, not the pointers to their
contents.
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">LIST_OF_TY_Sort(list, dir, prop)</span></code> sorts the given <code class="display"><span class="extract">list</span></code> in ascending order
if <code class="display"><span class="extract">dir</span></code> is 1, in descending order if <code class="display"><span class="extract">dir</span></code> is -1, or in random order if
<code class="display"><span class="extract">dir</span></code> is 2. The comparison used is the one for the kind of value stored in
the list, unless the optional argument <code class="display"><span class="extract">prop</span></code> is supplied, in which case
we sort based not on the item values but on their values for the property
<code class="display"><span class="extract">prop</span></code>. (This only makes sense if the list contains objects.)
</p>
<pre class="display">
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">LIST_OF_TY_Sort_cf</span><span class="plain">;</span>
<span class="plain">[ </span><span class="identifier">LIST_OF_TY_Sort</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">dir</span><span class="plain"> </span><span class="identifier">prop</span><span class="plain"> </span><span class="identifier">cf</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> </span><span class="identifier">no_items</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">;</span>
<span class="identifier">BlkMakeMutable</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">);</span>
<span class="identifier">no_items</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_LENGTH_F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dir</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_items</span><span class="plain"> &lt; </span><span class="constant">2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=1:</span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_items</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">j</span><span class="plain"> = </span><span class="reserved">random</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">+1) </span><span class="constant">-</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">));</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">SetSortDomain</span><span class="plain">(</span><span class="identifier">ListSwapEntries</span><span class="plain">, </span><span class="identifier">ListCompareEntries</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cf</span><span class="plain">) </span><span class="identifier">LIST_OF_TY_Sort_cf</span><span class="plain"> = </span><span class="identifier">BlkValueCompare</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LIST_OF_TY_Sort_cf</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">SortArray</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">dir</span><span class="plain">, </span><span class="identifier">no_items</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">ListSwapEntries</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">==</span><span class="identifier">j</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">-1);</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">-1, </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">-1));</span>
<span class="identifier">BlkValueWrite</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">-1, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">ListCompareEntries</span><span class="plain"> </span><span class="identifier">list</span><span class="plain"> </span><span class="identifier">col</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> </span><span class="identifier">cf</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">==</span><span class="identifier">j</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">i</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">i</span><span class="plain">-1);</span>
<span class="identifier">j</span><span class="plain"> = </span><span class="identifier">BlkValueRead</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">, </span><span class="identifier">LIST_ITEM_BASE</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">-1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I7S_Col</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">I7S_Col</span><span class="plain">) </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">.</span><span class="identifier">I7S_Col</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">I7S_Col</span><span class="plain">) </span><span class="identifier">j</span><span class="plain">=</span><span class="identifier">j</span><span class="plain">.</span><span class="identifier">I7S_Col</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0;</span>
<span class="identifier">cf</span><span class="plain"> = </span><span class="identifier">LIST_OF_TY_Sort_cf</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">cf</span><span class="plain"> = </span><span class="identifier">LIST_OF_TY_ComparisonFn</span><span class="plain">(</span><span class="identifier">list</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cf</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> &gt; </span><span class="identifier">j</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="identifier">j</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">-1</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">cf</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="S-rt2.html">Back to 'RegExp Template'</a></li><li><a href="S-ct2.html">Continue with 'Combinations Template'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/am' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Arch Module</b></li></ul><p class="purpose">Setting up the use of this module.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Arch Module</b></li></ul><p class="purpose">Setting up the use of this module.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Introduction</a></li><li><a href="#SP3">&#167;3. The beginning</a></li><li><a href="#SP4">&#167;4. The end</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/arc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#2">Chapter 2: Architectures</a></li><li><b>Architectures</b></li></ul><p class="purpose">To deal with multiple inter architectures.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#2">Chapter 2: Architectures</a></li><li><b>Architectures</b></li></ul><p class="purpose">To deal with multiple inter architectures.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Architectures</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/cmp' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#2">Chapter 2: Architectures</a></li><li><b>Compatibility</b></li></ul><p class="purpose">To manage compatibility lists: what can be compiled to what format.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#2">Chapter 2: Architectures</a></li><li><b>Compatibility</b></li></ul><p class="purpose">To manage compatibility lists: what can be compiled to what format.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/tvm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#2">Chapter 2: Architectures</a></li><li><b>Target Virtual Machines</b></li></ul><p class="purpose">To deal with multiple inter architectures.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#2">Chapter 2: Architectures</a></li><li><b>Target Virtual Machines</b></li></ul><p class="purpose">To deal with multiple inter architectures.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Architectures</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/vn' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#2">Chapter 2: Architectures</a></li><li><b>Version Numbers</b></li></ul><p class="purpose">Semantic version numbers such as 3.7.1.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#2">Chapter 2: Architectures</a></li><li><b>Version Numbers</b></li></ul><p class="purpose">Semantic version numbers such as 3.7.1.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Standard adoption</a></li><li><a href="#SP5">&#167;5. Printing and parsing</a></li><li><a href="#SP8">&#167;8. Precendence</a></li><li><a href="#SP11">&#167;11. Trichotomy</a></li><li><a href="#SP13">&#167;13. Ranges</a></li><li><a href="#SP22">&#167;22. Unit tests</a></li></ul><hr class="tocbar">
@ -731,7 +731,7 @@ the boundary value is the same, open ends are stricter than closed ends.
<p class="endnote">The function VersionNumbers::stricter is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b>And so we finally arrive at the following, which intersects two ranges:
that is, it changes <code class="display"><span class="extract">R1</span></code> to the range of versions which lie ibside both the
that is, it changes <code class="display"><span class="extract">R1</span></code> to the range of versions which lie inside both the
original <code class="display"><span class="extract">R1</span></code> and also <code class="display"><span class="extract">R2</span></code>. (This is used by Inbuild when an extension is
included in two different places in the source text, but with possibly
different version needs.) The return value is true if an actual change took

View file

@ -54,7 +54,7 @@
</nav>
<main role="main">
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><b>arch </b></li></ul>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><b>arch </b></li></ul>
<p class="purpose">Definitions of Inter and final VM architectures.</p>
<hr>
<ul class="chapterlist">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/bm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Building Module</b></li></ul><p class="purpose">Setting up the use of this module.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Building Module</b></li></ul><p class="purpose">Setting up the use of this module.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Introduction</a></li><li><a href="#SP2">&#167;2. Setting up the memory manager</a></li><li><a href="#SP4">&#167;4. The beginning</a></li><li><a href="#SP5">&#167;5. The end</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/bs' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Building Site</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>The maximum here is beyond plenty: it's not the maximum hierarchical depth
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Building Site</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>The maximum here is beyond plenty: it's not the maximum hierarchical depth
of the Inter output, it's the maximum number of times that Inform interrupts
itself during compilation.
</p>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/hl' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Hierarchy Locations</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Requirements. </b>Inform's code for compiling resources to different positions in the Inter hierarchy
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Hierarchy Locations</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Requirements. </b>Inform's code for compiling resources to different positions in the Inter hierarchy
is quite defensively written, in order to keep everything to a fairly tightly
specified schema.
</p>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/in' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Inter Namespace</b></li></ul><p class="purpose">To manage identifiers, which have names and positions in the Inter hierarchy.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Inter Namespace</b></li></ul><p class="purpose">To manage identifiers, which have names and positions in the Inter hierarchy.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Families</a></li><li><a href="#SP2">&#167;2. Printing inames</a></li><li><a href="#SP4">&#167;4. Making new inames</a></li><li><a href="#SP8">&#167;8. Conversion of inames to symbols</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/ip' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Inter Primitives</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Inter Primitives</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<pre class="display">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/pck' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Packaging</b></li></ul><p class="purpose">To manage requests to build Inter packages, and then to generate inames within them; and to create modules and submodules.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Packaging</b></li></ul><p class="purpose">To manage requests to build Inter packages, and then to generate inames within them; and to create modules and submodules.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Package requests</a></li><li><a href="#SP10">&#167;10. Bubbles</a></li><li><a href="#SP11">&#167;11. Outside the packages</a></li><li><a href="#SP12">&#167;12. Entry and exit</a></li><li><a href="#SP13">&#167;13. Incarnation</a></li><li><a href="#SP14">&#167;14. Compilation modules</a></li><li><a href="#SP15">&#167;15. Modules</a></li><li><a href="#SP16">&#167;16. Submodules</a></li><li><a href="#SP19">&#167;19. Functions</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/pt' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Package Types</b></li></ul><p class="purpose">To manage the different types of packages emitted by Inform.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Package Types</b></li></ul><p class="purpose">To manage the different types of packages emitted by Inform.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Package types</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/trn' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Translation</b></li></ul><p class="purpose">A way to express rules for how to translate names from the Inter namespace into the target language's namespace.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>Translation</b></li></ul><p class="purpose">A way to express rules for how to translate names from the Inter namespace into the target language's namespace.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>This section of code is pleasingly simple: it has no functionality, and exists as
a stand-alone section just to give these functions legible names.

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/tv' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>The Veneer</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#1">Chapter 1: Architecture</a></li><li><b>The Veneer</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<pre class="definitions">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/eis' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#2">Chapter 2: Blueprints</a></li><li><b>Emitting Inter Schemas</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Compilation. </b></p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#2">Chapter 2: Blueprints</a></li><li><b>Emitting Inter Schemas</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Compilation. </b></p>
<pre class="display">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/is' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#2">Chapter 2: Blueprints</a></li><li><b>Inter Schemas</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definition. </b>An inter schema is a set of instructions for compiling inter code, while
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#2">Chapter 2: Blueprints</a></li><li><b>Inter Schemas</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definition. </b>An inter schema is a set of instructions for compiling inter code, while
interspersing certain values at given places.
</p>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '3/pi' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#3">Chapter 3: Masonry</a></li><li><b>Producing Inter</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#3">Chapter 3: Masonry</a></li><li><b>Producing Inter</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '3/vh' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">building</a></li><li><a href="index.html#3">Chapter 3: Masonry</a></li><li><b>Value Holsters</b></li></ul><p class="purpose">To manage requests for compilation to Inter.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#3">Chapter 3: Masonry</a></li><li><b>Value Holsters</b></li></ul><p class="purpose">To manage requests for compilation to Inter.</p>
<ul class="toc"><li><a href="#SP3">&#167;3. Conversions</a></li><li><a href="#SP4">&#167;4. Holstering data</a></li></ul><hr class="tocbar">

View file

@ -54,7 +54,7 @@
</nav>
<main role="main">
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><b>building </b></li></ul>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><b>building </b></li></ul>
<p class="purpose">An intermediate layer for building code in Inter.</p>
<hr>
<ul class="chapterlist">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/arc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Architecture</b></li></ul><p class="purpose">To deal with multiple inter architectures.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Architecture</b></li></ul><p class="purpose">To deal with multiple inter architectures.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Current architecture</a></li><li><a href="#SP2">&#167;2. Prepare stage</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/cm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Codegen Module</b></li></ul><p class="purpose">Setting up the use of this module.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Codegen Module</b></li></ul><p class="purpose">Setting up the use of this module.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Introduction</a></li><li><a href="#SP2">&#167;2. Setting up the memory manager</a></li><li><a href="#SP4">&#167;4. The beginning</a></li><li><a href="#SP5">&#167;5. The end</a></li></ul><hr class="tocbar">

View file

@ -1,109 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/arc</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '1/lbr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Libraries</b></li></ul><p class="purpose">Architecture-neutral blocks of linkable inter material are called libraries.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. </a></li><li><a href="#SP2">&#167;2. Link stage</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_library</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">location</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">attachment_point</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inter_library</span><span class="plain">;</span>
<span class="reserved">inter_library</span><span class="plain"> *</span><span class="functiontext">CodeGen::Libraries::new</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">inter_library</span><span class="plain"> *</span><span class="identifier">lib</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inter_library</span><span class="plain">);</span>
<span class="identifier">lib</span><span class="plain">-</span><span class="element">&gt;location</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">;</span>
<span class="identifier">lib</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">lib</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain">, </span><span class="string">"/main/%S"</span><span class="plain">, </span><span class="identifier">Pathnames::directory_name</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lib</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">CodeGen::Libraries::location</span><span class="plain">(</span><span class="reserved">inter_library</span><span class="plain"> *</span><span class="identifier">lib</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lib</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no library"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lib</span><span class="plain">-</span><span class="element">&gt;location</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">CodeGen::Libraries::URL</span><span class="plain">(</span><span class="reserved">inter_library</span><span class="plain"> *</span><span class="identifier">lib</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lib</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lib</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inter_library</span><span class="plain"> *</span><span class="functiontext">CodeGen::Libraries::find</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain"> **</span><span class="identifier">PP</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">N</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">PP</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kit_metadata.txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::Libraries::new</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Libraries::new appears nowhere else.</p>
<p class="endnote">The function CodeGen::Libraries::location appears nowhere else.</p>
<p class="endnote">The function CodeGen::Libraries::URL appears nowhere else.</p>
<p class="endnote">The function CodeGen::Libraries::find appears nowhere else.</p>
<p class="endnote">The structure inter_library is private to this section.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Link stage. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Libraries::create_pipeline_stage</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"link"</span><span class="plain">, </span><span class="functiontext">CodeGen::Libraries::run_link_stage</span><span class="plain">, </span><span class="constant">NO_STAGE_ARG</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Libraries::run_link_stage</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">inter_library</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">inter_library</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;requirements_list</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="string">"%S.interb"</span><span class="plain">, </span><span class="functiontext">CodeGen::Architecture::leafname</span><span class="plain">());</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">arch_file</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;location</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">arch_file</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no arch file for requirement"</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">sidecar</span><span class="plain"> = </span><span class="identifier">Inter::Tree::new</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Binary::test_file</span><span class="plain">(</span><span class="identifier">arch_file</span><span class="plain">)) </span><span class="identifier">Inter::Binary::read</span><span class="plain">(</span><span class="identifier">sidecar</span><span class="plain">, </span><span class="identifier">arch_file</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Inter::Textual::read</span><span class="plain">(</span><span class="identifier">sidecar</span><span class="plain">, </span><span class="identifier">arch_file</span><span class="plain">);</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain"> = </span><span class="identifier">Inter::Packages::by_url</span><span class="plain">(</span><span class="identifier">sidecar</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pack</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"sought attachment material at: %S in %f\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain">, </span><span class="identifier">arch_file</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unable to find attachment point package"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">Inter::Transmigration::move</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">Site::main_package</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">), </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Libraries::create_pipeline_stage is used in 1/stg (<a href="1-stg.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function CodeGen::Libraries::run_link_stage appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-arc.html">Back to 'Architecture'</a></li><li><a href="1-ppl.html">Continue with 'Pipelines'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/li' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Link Instructions</b></li></ul><p class="purpose">Inter often needs to assimilate or otherwise deal with architecture-neutral kits of linkable material, and this is where such requirements are noted.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Link Instructions</b></li></ul><p class="purpose">Inter often needs to assimilate or otherwise deal with architecture-neutral kits of linkable material, and this is where such requirements are noted.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. </a></li><li><a href="#SP2">&#167;2. Link stage</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/ppl' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Pipelines</b></li></ul><p class="purpose">To build and run through pipelines of code generation stages.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Pipelines</b></li></ul><p class="purpose">To build and run through pipelines of code generation stages.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Steps</a></li><li><a href="#SP4">&#167;4. Pipelines</a></li><li><a href="#SP5">&#167;5. Following</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/stg' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Stages</b></li></ul><p class="purpose">To create the stages through which code generation proceeds.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Stages</b></li></ul><p class="purpose">To create the stages through which code generation proceeds.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Stages</a></li><li><a href="#SP2">&#167;2. Creation</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/alm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Assimilate Linked Matter</b></li></ul><p class="purpose">To assimilate the material in parsed non-code splats.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Assimilate Linked Matter</b></li></ul><p class="purpose">To assimilate the material in parsed non-code splats.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li><li><a href="#SP2">&#167;2. Parsing</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/erl' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Eliminate Redundant Labels</b></li></ul><p class="purpose">To remove labels which are defined but never jumped to.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Eliminate Redundant Labels</b></li></ul><p class="purpose">To remove labels which are defined but never jumped to.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li><li><a href="#SP1_1">&#167;1.1. Peephole optimisation</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/erm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Eliminate Redundant Matter</b></li></ul><p class="purpose">To remove (for example) functions which we can prove will never be called or referred to as values.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Eliminate Redundant Matter</b></li></ul><p class="purpose">To remove (for example) functions which we can prove will never be called or referred to as values.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li><li><a href="#SP2">&#167;2. Preservation</a></li><li><a href="#SP4">&#167;4. Destruction</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/ip' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Inspect Plugs</b></li></ul><p class="purpose">To make sure certain symbol names translate into globally unique target symbols.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Inspect Plugs</b></li></ul><p class="purpose">To make sure certain symbol names translate into globally unique target symbols.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/itr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>I6 Template Reader</b></li></ul><p class="purpose">Inform 6 meta-language is the language used by template files (with extension |.i6t|); we need tp be able to read it here in order to assimilate template code.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>I6 Template Reader</b></li></ul><p class="purpose">Inform 6 meta-language is the language used by template files (with extension |.i6t|); we need tp be able to read it here in order to assimilate template code.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Interventions</a></li><li><a href="#SP5">&#167;5. I6T kits</a></li><li><a href="#SP8">&#167;8. Syntax of I6T files</a></li><li><a href="#SP10_2_4_3">&#167;10.2.4.3. Acting on I6T commands</a></li><li><a href="#SP11">&#167;11. Contents section</a></li><li><a href="#SP12">&#167;12. Template errors</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/lnk' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Linker</b></li></ul><p class="purpose">To link inter from I7 with template code.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Linker</b></li></ul><p class="purpose">To link inter from I7 with template code.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Link</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/plm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Parse Linked Matter</b></li></ul><p class="purpose">To generate the initial state of storage for variables.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Parse Linked Matter</b></li></ul><p class="purpose">To generate the initial state of storage for variables.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li><li><a href="#SP2">&#167;2. Parsing</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/rcc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Resolving Conditional Compilation</b></li></ul><p class="purpose">To generate the initial state of storage for variables.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Resolving Conditional Compilation</b></li></ul><p class="purpose">To generate the initial state of storage for variables.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li><li><a href="#SP2">&#167;2. Resolution</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/res' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Resolve External Symbols</b></li></ul><p class="purpose">To make sure certain symbol names translate into globally unique target symbols.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Resolve External Symbols</b></li></ul><p class="purpose">To make sure certain symbol names translate into globally unique target symbols.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/rv' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Reconcile Verbs</b></li></ul><p class="purpose">To reconcile clashes between assimilated and originally generated verbs.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Reconcile Verbs</b></li></ul><p class="purpose">To reconcile clashes between assimilated and originally generated verbs.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li><li><a href="#SP2">&#167;2. Parsing</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '2/unq' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Uniqueness</b></li></ul><p class="purpose">To make sure certain symbol names translate into globally unique target symbols.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Uniqueness</b></li></ul><p class="purpose">To make sure certain symbol names translate into globally unique target symbols.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '3/cal' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#3">Chapter 3: Inter to Final Code</a></li><li><b>Constants and Literals</b></li></ul><p class="purpose">To generate final code for constants, including arrays.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#3">Chapter 3: Inter to Final Code</a></li><li><b>Constants and Literals</b></li></ul><p class="purpose">To generate final code for constants, including arrays.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '3/cg' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#3">Chapter 3: Inter to Final Code</a></li><li><b>Code Generation</b></li></ul><p class="purpose">To generate final code from intermediate code.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#3">Chapter 3: Inter to Final Code</a></li><li><b>Code Generation</b></li></ul><p class="purpose">To generate final code from intermediate code.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li><li><a href="#SP2">&#167;2. Generations</a></li><li><a href="#SP8">&#167;8. </a></li><li><a href="#SP10">&#167;10. Marking</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '3/fc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#3">Chapter 3: Inter to Final Code</a></li><li><b>Frame Control</b></li></ul><p class="purpose">To manage the final-code process, at the frame level.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#3">Chapter 3: Inter to Final Code</a></li><li><b>Frame Control</b></li></ul><p class="purpose">To manage the final-code process, at the frame level.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '3/iap' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#3">Chapter 3: Inter to Final Code</a></li><li><b>Instances and Properties</b></li></ul><p class="purpose">To generate the initial state of storage for instances and their properties, and all associated metadata.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#3">Chapter 3: Inter to Final Code</a></li><li><b>Instances and Properties</b></li></ul><p class="purpose">To generate the initial state of storage for instances and their properties, and all associated metadata.</p>
<ul class="toc"><li><a href="#SP2">&#167;2. Representing instances in I6</a></li><li><a href="#SP3">&#167;3. Representing properties in I6</a></li><li><a href="#SP4">&#167;4. Properties</a></li><li><a href="#SP5_7">&#167;5.7. The kind inheritance tree</a></li><li><a href="#SP5_8">&#167;5.8. Lookup mechanism for properties of value instances</a></li><li><a href="#SP6">&#167;6. Instances</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '3/vrb' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#3">Chapter 3: Inter to Final Code</a></li><li><b>Variables</b></li></ul><p class="purpose">To generate the initial state of storage for variables.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#3">Chapter 3: Inter to Final Code</a></li><li><b>Variables</b></li></ul><p class="purpose">To generate the initial state of storage for variables.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/fbi' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Final Binary Inter</b></li></ul><p class="purpose">To create the range of possible targets into which Inter can be converted.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Final Binary Inter</b></li></ul><p class="purpose">To create the range of possible targets into which Inter can be converted.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>This target is very simple: when we get the message to begin generation,
we simply ask the Inter module to output some text, and return true to

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/fi' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Final Inventory</b></li></ul><p class="purpose">To print a summary of the contents of a repository.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Final Inventory</b></li></ul><p class="purpose">To print a summary of the contents of a repository.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>This target is fairly simple: when we get the message to begin generation,
we simply ask the Inter module to output some text, and return true to

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/ft' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Final Targets</b></li></ul><p class="purpose">To create the range of possible targets into which Inter can be converted.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Final Targets</b></li></ul><p class="purpose">To create the range of possible targets into which Inter can be converted.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Targets</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/fti' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Final Textual Inter</b></li></ul><p class="purpose">To create the range of possible targets into which Inter can be converted.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Final Textual Inter</b></li></ul><p class="purpose">To create the range of possible targets into which Inter can be converted.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>This target is very simple: when we get the message to begin generation,
we simply ask the Inter module to output some text, and return true to

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '4/gi6' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Generating Inform 6</b></li></ul><p class="purpose">To generate I6 code from intermediate code.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Generating Inform 6</b></li></ul><p class="purpose">To generate I6 code from intermediate code.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Target</a></li><li><a href="#SP2">&#167;2. Segmentation</a></li></ul><hr class="tocbar">

View file

@ -54,7 +54,7 @@
</nav>
<main role="main">
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><b>codegen </b></li></ul>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><b>codegen </b></li></ul>
<p class="purpose">The code generation pipeline.</p>
<hr>
<ul class="chapterlist">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/cm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>Core Module</b></li></ul><p class="purpose">Setting up the use of this module.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>Core Module</b></li></ul><p class="purpose">Setting up the use of this module.</p>
<ul class="toc"><li><a href="#SP2">&#167;2. Setting up the memory manager</a></li><li><a href="#SP5">&#167;5. The beginning</a></li><li><a href="#SP8">&#167;8. The end</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/htc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>How To Compile</b></li></ul><p class="purpose">The long production line on which products of Inform are built, one step at a time.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>How To Compile</b></li></ul><p class="purpose">The long production line on which products of Inform are built, one step at a time.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>Having seen the top management of the factory, we now reach the factory
floor, which is one long production line: around 150 steps must be performed

View file

@ -1,355 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/cm</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '1/kts' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>Kits</b></li></ul><p class="purpose">A kit is a combination of Inter code with an Inform 7 extension.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Kits</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Kits. </b></p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_kit</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">location</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">attachment_point</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">early_source</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">ittt</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">inform_kit_ittt</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">kind_definitions</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">text_stream</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">extensions</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">text_stream</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">activations</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">element_activation</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">index_template</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">defines_Main</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">supports_natural_language</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">priority</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inform_kit</span><span class="plain">;</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_kit_ittt</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">if_name</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">if_included</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">then_name</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inform_kit_ittt</span><span class="plain">;</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">element_activation</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">element_name</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">activate</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">element_activation</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="functiontext">Kits::find</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain"> **</span><span class="identifier">PP</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">N</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">PP</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kit_metadata.txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="functiontext">Kits::load_at</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inform_kit</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain">, </span><span class="string">"/main/%S"</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;location</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">;</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain"> = 10;</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;ittt</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inform_kit_ittt</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;kind_definitions</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;activations</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">element_activation</span><span class="plain">);</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_natural_language</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;index_template</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;location</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kit_metadata.txt"</span><span class="plain">);</span>
<span class="identifier">TextFiles::read</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="functiontext">Kits::read_metadata</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">K</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="functiontext">Kits::load</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Kits::find</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="constant">NO_FS_AREAS</span><span class="plain">, </span><span class="identifier">pathname_of_inter_resources</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"Cannot find kit '%S'\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">Problems::Fatal::issue</span><span class="plain">(</span><span class="string">"Unable to find one of the Inform support kits"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Kits::load_at</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::dependency</span><span class="plain">(</span><span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">if_text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">inc</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">then_text</span><span class="plain">) {</span>
<span class="reserved">inform_kit_ittt</span><span class="plain"> *</span><span class="identifier">ITTT</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inform_kit_ittt</span><span class="plain">);</span>
<span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;if_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">if_text</span><span class="plain">);</span>
<span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;if_included</span><span class="plain"> = </span><span class="identifier">inc</span><span class="plain">;</span>
<span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;then_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">then_text</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">ITTT</span><span class="plain">, </span><span class="reserved">inform_kit_ittt</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;ittt</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::activation</span><span class="plain">(</span><span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">act</span><span class="plain">) {</span>
<span class="reserved">element_activation</span><span class="plain"> *</span><span class="identifier">EA</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">element_activation</span><span class="plain">);</span>
<span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;element_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;activate</span><span class="plain"> = </span><span class="identifier">act</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">EA</span><span class="plain">, </span><span class="reserved">element_activation</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;activations</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::read_metadata</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = (</span><span class="reserved">inform_kit</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::is_whitespace</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">)) || (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *#%c*"</span><span class="plain">))) {</span>
<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"defines Main: yes"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"defines Main: no"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"natural language: yes"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_natural_language</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"natural language: no"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;supports_natural_language</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"insert: (%c*)"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain">, </span><span class="string">"\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"priority: (%d*)"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain"> = </span><span class="identifier">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], 0);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"kinds: (%C+)"</span><span class="plain">)) {</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]), </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;kind_definitions</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"extension: (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]), </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"activate: (%c+)"</span><span class="plain">)) {</span>
<span class="functiontext">Kits::activation</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"deactivate: (%c+)"</span><span class="plain">)) {</span>
<span class="functiontext">Kits::activation</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"dependency: if (%C+) then (%C+)"</span><span class="plain">)) {</span>
<span class="functiontext">Kits::dependency</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"dependency: if not (%C+) then (%C+)"</span><span class="plain">)) {</span>
<span class="functiontext">Kits::dependency</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"index from: (%c*)"</span><span class="plain">)) {</span>
<span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;index_template</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Errors::in_text_file</span><span class="plain">(</span><span class="string">"illegible line in kit metadata file"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"'%S'\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kits::loaded</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::perform_ittt</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">changes_made</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">changes_made</span><span class="plain">) {</span>
<span class="identifier">changes_made</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">) {</span>
<span class="reserved">inform_kit_ittt</span><span class="plain"> *</span><span class="identifier">ITTT</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">ITTT</span><span class="plain">, </span><span class="reserved">inform_kit_ittt</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;ittt</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Kits::loaded</span><span class="plain">(</span><span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;then_name</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Kits::loaded</span><span class="plain">(</span><span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;if_name</span><span class="plain">) == </span><span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;if_included</span><span class="plain">)) {</span>
<span class="functiontext">Kits::load</span><span class="plain">(</span><span class="identifier">ITTT</span><span class="plain">-</span><span class="element">&gt;then_name</span><span class="plain">);</span>
<span class="identifier">changes_made</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">kits_requested</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">kits_to_include</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::request</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kits_requested</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">kits_requested</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain">);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">kit_name</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kit_name</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">kits_requested</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">kit_name</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">), </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">kits_requested</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::determine</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kits_requested</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Kits::request</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"CommandParserKit"</span><span class="plain">);</span>
<span class="functiontext">Kits::request</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"BasicInformKit"</span><span class="plain">);</span>
<span class="functiontext">NaturalLanguages::request_required_kits</span><span class="plain">();</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">kit_name</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kit_name</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">kits_requested</span><span class="plain">)</span>
<span class="functiontext">Kits::load</span><span class="plain">(</span><span class="identifier">kit_name</span><span class="plain">);</span>
<span class="functiontext">Kits::perform_ittt</span><span class="plain">();</span>
<span class="identifier">kits_to_include</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inform_kit</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">p</span><span class="plain">=0; </span><span class="identifier">p</span><span class="plain">&lt;100; </span><span class="identifier">p</span><span class="plain">++) {</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain"> == </span><span class="identifier">p</span><span class="plain">)</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">, </span><span class="identifier">kits_to_include</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">, </span><span class="identifier">kits_to_include</span><span class="plain">)</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Using Inform kit '%S' (priority %d).\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;priority</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::load_types</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">, </span><span class="identifier">kits_to_include</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">segment</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">segment</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;kind_definitions</span><span class="plain">) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;location</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kinds"</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">segment</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Loading kinds definitions from %f\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="functiontext">I6T::interpret_kindt</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::activate_plugins</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Activate plugins...\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">Plugins::Manage::activate</span><span class="plain">(</span><span class="constant">CORE_PLUGIN_NAME</span><span class="plain">);</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">, </span><span class="identifier">kits_to_include</span><span class="plain">) {</span>
<span class="reserved">element_activation</span><span class="plain"> *</span><span class="identifier">EA</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">EA</span><span class="plain">, </span><span class="reserved">element_activation</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;activations</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Plugins::Manage::parse</span><span class="plain">(</span><span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;element_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> == -1)</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">Untestable</span><span class="plain">),</span>
<span class="string">"one of the Inform kits made reference to a language segment which does not exist"</span><span class="plain">,</span>
<span class="string">"which strongly suggests that Inform is not properly installed."</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> &gt;= 0) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">EA</span><span class="plain">-</span><span class="element">&gt;activate</span><span class="plain">) </span><span class="functiontext">Plugins::Manage::activate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Plugins::Manage::deactivate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">Plugins::Manage::show</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="string">"Included"</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Plugins::Manage::show</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="string">"Excluded"</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kits::Main_defined</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">, </span><span class="identifier">kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;defines_Main</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">Kits::index_template</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">, </span><span class="identifier">kits_to_include</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;index_template</span><span class="plain">)</span>
<span class="identifier">I</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;index_template</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::find appears nowhere else.</p>
<p class="endnote">The function Kits::load_at appears nowhere else.</p>
<p class="endnote">The function Kits::load appears nowhere else.</p>
<p class="endnote">The function Kits::dependency appears nowhere else.</p>
<p class="endnote">The function Kits::activation appears nowhere else.</p>
<p class="endnote">The function Kits::read_metadata appears nowhere else.</p>
<p class="endnote">The function Kits::loaded appears nowhere else.</p>
<p class="endnote">The function Kits::perform_ittt appears nowhere else.</p>
<p class="endnote">The function Kits::request is used in 1/mr (<a href="1-mr.html#SP6">&#167;6</a>), 3/nl (<a href="3-nl.html#SP18">&#167;18</a>).</p>
<p class="endnote">The function Kits::determine is used in 1/mr (<a href="1-mr.html#SP4_8">&#167;4.8</a>).</p>
<p class="endnote">The function Kits::load_types is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Kits::activate_plugins is used in 1/mr (<a href="1-mr.html#SP4_10">&#167;4.10</a>).</p>
<p class="endnote">The function Kits::Main_defined is used in 1/mr (<a href="1-mr.html#SP4_15">&#167;4.15</a>).</p>
<p class="endnote">The function Kits::index_template is used in 1/mr (<a href="1-mr.html#SP4_17">&#167;4.17</a>).</p>
<p class="endnote">The structure inform_kit is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure inform_kit_ittt is private to this section.</p>
<p class="endnote">The structure element_activation is accessed in 5/lp and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>In particular, every source text read into Inform is automatically prefixed by
the following eight words &mdash; if Inform were a computer, this would be the BIOS
which boots up its operating system. (In that the rest of the creation of the
I7 world model is handled by source text in the Standard Rules.)
</p>
<p class="inwebparagraph">Because of this mandatory insertion, one extension, the Standard Rules, is
compulsorily included in every run. So there will certainly be at least two
files of source text to be read, and quite possibly more.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MANDATORY_INSERTED_TEXT</span><span class="plain"> </span><span class="identifier">L</span><span class="string">"Include Basic Inform by Graham Nelson. Include the Standard Rules by Graham Nelson.\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span>
<span class="definitionkeyword">define</span> <span class="constant">BASIC_MODE_INSERTED_TEXT</span><span class="plain"> </span><span class="identifier">L</span><span class="string">"Include Basic Inform by Graham Nelson.\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span>
</pre>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kits::feed_early_source_text</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">, </span><span class="identifier">kits_to_include</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">X</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Include %S.\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">X</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Kits::number_of_early_fed_sentences</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = 0;</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">, </span><span class="identifier">kits_to_include</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">X</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;extensions</span><span class="plain">) </span><span class="identifier">N</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;early_source</span><span class="plain">) </span><span class="identifier">N</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">requirements_list</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="functiontext">Kits::list_of_inter_libraries</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">requirements_list</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">link_instruction</span><span class="plain">);</span>
<span class="reserved">inform_kit</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">inform_kit</span><span class="plain">, </span><span class="identifier">kits_to_include</span><span class="plain">) {</span>
<span class="identifier">link_instruction</span><span class="plain"> *</span><span class="identifier">link</span><span class="plain"> = </span><span class="identifier">CodeGen::LinkInstructions::new</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;location</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">&gt;attachment_point</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">link</span><span class="plain">, </span><span class="identifier">link_instruction</span><span class="plain">, </span><span class="identifier">requirements_list</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">requirements_list</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Kits::feed_early_source_text is used in 3/rst (<a href="3-rst.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Kits::number_of_early_fed_sentences appears nowhere else.</p>
<p class="endnote">The function Kits::list_of_inter_libraries is used in 1/mr (<a href="1-mr.html#SP4_16">&#167;4.16</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-cm.html">Back to 'Core Module'</a></li><li><a href="1-pp.html">Continue with 'Progress Percentages'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/mr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>Main Routine</b></li></ul><p class="purpose">The top level of the Inform 7 compiler, reading command line arguments and preparing the way.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>Main Routine</b></li></ul><p class="purpose">The top level of the Inform 7 compiler, reading command line arguments and preparing the way.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. The Management</a></li><li><a href="#SP2">&#167;2. Command line processing</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/pp' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>Progress Percentages</b></li></ul><p class="purpose">This tiny section, the Lichtenstein of Inform, prints percentage of completion estimates so that the host application can intercept them and update its graphical progress bar.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>Progress Percentages</b></li></ul><p class="purpose">This tiny section, the Lichtenstein of Inform, prints percentage of completion estimates so that the host application can intercept them and update its graphical progress bar.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>Clearly we can only estimate how far Inform has progressed. While we could in
principle measure the number of CPU-seconds it has run for, we don't know

View file

@ -1,818 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/pp</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '1/wel' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>Where Everything Lives</b></li></ul><p class="purpose">To configure the many locations used in the host filing system.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP5">&#167;5. Command line settings</a></li><li><a href="#SP6">&#167;6. Establishing the defaults</a></li><li><a href="#SP6_1">&#167;6.1. Internal resources</a></li><li><a href="#SP6_2">&#167;6.2. External resources</a></li><li><a href="#SP6_3">&#167;6.3. Project resources</a></li><li><a href="#SP6_4">&#167;6.4. Materials resources</a></li><li><a href="#SP7">&#167;7. EILTs</a></li><li><a href="#SP8">&#167;8. Location of extensions</a></li><li><a href="#SP10">&#167;10. Location of index files</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>This section of the Inform source is intended to give a single description
of where everything lives in the filing system. Very early in Inform's run,
it works out the filenames of everything it will ever need to refer to, and
these are stored in the following globals. Explanations are given below,
not here. First, some "areas":
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">NO_FS_AREAS</span><span class="plain"> 3</span>
<span class="definitionkeyword">define</span> <span class="constant">MATERIALS_FS_AREA</span><span class="plain"> 0 </span> <span class="comment">must match <code class="display"><span class="extract">ORIGIN_WAS_*</span></code> constants minus 1</span>
<span class="definitionkeyword">define</span> <span class="constant">EXTERNAL_FS_AREA</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">INTERNAL_FS_AREA</span><span class="plain"> 2</span>
</pre>
<pre class="display">
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">AREA_NAME</span><span class="plain">[3] = { </span><span class="string">"from .materials"</span><span class="plain">, </span><span class="string">"installed"</span><span class="plain">, </span><span class="string">"built in"</span><span class="plain"> };</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Now for the folders:
</p>
<pre class="display">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">NO_FS_AREAS</span><span class="plain">] = { </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain"> };</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_extensions</span><span class="plain">[</span><span class="constant">NO_FS_AREAS</span><span class="plain">] = { </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain"> };</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_inter_resources</span><span class="plain">[</span><span class="constant">NO_FS_AREAS</span><span class="plain">] = { </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain"> };</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_languages</span><span class="plain">[</span><span class="constant">NO_FS_AREAS</span><span class="plain">] = { </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain"> };</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_website_templates</span><span class="plain">[</span><span class="constant">NO_FS_AREAS</span><span class="plain">] = { </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain"> };</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_extension_docs</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_extension_docs_inner</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_HTML_models</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_materials_figures</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_materials_release</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_materials_sounds</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_project</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_project_index_details_folder</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_project_index_folder</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_released_figures</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_released_interpreter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_released_sounds</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_transient_census_data</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_transient_external_resources</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And secondly, the files:
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_blurb</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_cblorb_report</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_cblorb_report_model</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_compiled_i6_code</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_debugging_log</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_default_inter_pipeline</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_documentation_snippets</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_epsfile</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_existing_story_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_extensions_dictionary</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_headings</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_i7_source</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_ifiction_record</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_intro_booklet</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_intro_postcard</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_large_cover_art_jpeg</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_large_cover_art_png</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_large_default_cover_art</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_manifest</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_options</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_parse_tree</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_report</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_small_cover_art_jpeg</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_small_cover_art_png</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_small_default_cover_art</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_SR_module</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_story_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_telemetry</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_uuid</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">filename_of_xrefs</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Command line settings. </b>The following are called when the command line is parsed.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::set_project</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="identifier">pathname_of_project</span><span class="plain"> = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::set_internal</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">] = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::set_default_internal</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">] = </span><span class="identifier">P</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::set_external</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">] = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::set_transient</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="identifier">pathname_of_transient_external_resources</span><span class="plain"> = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Locations::set_I7_source</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">filename_of_i7_source</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">filename_of_i7_source</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Locations::set_SR_module</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">loc</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">filename_of_SR_module</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">filename_of_SR_module</span><span class="plain"> = </span><span class="identifier">Filenames::from_text</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::set_project is used in 1/mr (<a href="1-mr.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Locations::set_internal is used in 1/mr (<a href="1-mr.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Locations::set_default_internal is used in 1/mr (<a href="1-mr.html#SP4_4">&#167;4.4</a>).</p>
<p class="endnote">The function Locations::set_external is used in 1/mr (<a href="1-mr.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Locations::set_transient is used in 1/mr (<a href="1-mr.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Locations::set_I7_source is used in 1/mr (<a href="1-mr.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Locations::set_SR_module appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Establishing the defaults. </b>Inform's file access happens inside four different areas: the internal
resources area, usually inside the Inform application; the external resources
area, which is where the user (or the application acting on the user's behalf)
installs extensions; the project bundle, say <code class="display"><span class="extract">Example.inform</span></code>; and, alongside
that, the materials folder, <code class="display"><span class="extract">Example.materials</span></code>.
</p>
<p class="inwebparagraph">Inform can run in two modes: regular mode, when it's compiling source text,
and census mode, when it's scanning the file system for extensions.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Locations::set_defaults</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">census_mode</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Internal resources</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">External resources</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Project resources</span> <span class="cwebmacronumber">6.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Materials resources</span> <span class="cwebmacronumber">6.4</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">census_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">filename_of_i7_source</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="identifier">Problems::Fatal::issue</span><span class="plain">(</span><span class="string">"Except in census mode, source text must be supplied"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">census_mode</span><span class="plain">) &amp;&amp; (</span><span class="identifier">filename_of_i7_source</span><span class="plain">))</span>
<span class="identifier">Problems::Fatal::issue</span><span class="plain">(</span><span class="string">"In census mode, no source text may be supplied"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::set_defaults is used in 1/mr (<a href="1-mr.html#SP4_5">&#167;4.5</a>).</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. Internal resources. </b>Inform needs a whole pile of files to have been installed on the host computer
before it can run: everything from the Standard Rules to a PDF file explaining
what interactive fiction is. They're never written to, only read. They are
referred to as "internal" or "built-in", and they occupy a folder called the
"internal resources" folder.
</p>
<p class="inwebparagraph">Unfortunately we don't know where it is. Typically this compiler will be an
executable sitting somewhere inside a user interface application, and the
internal resources folder will be somewhere else inside it. But we don't
know how to find that folder, and we don't want to make any assumptions.
Inform therefore requires on every run that it be told via the <code class="display"><span class="extract">-internal</span></code>
switch where the internal resources folder is.
</p>
<p class="inwebparagraph">The main ingredients here are the "EILT" resources: extensions, I6T files,
language definitions, and website templates. The Standard Rules, for
example, live inside the Extensions part of this.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Internal resources</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">Problems::Fatal::issue</span><span class="plain">(</span><span class="string">"Did not set -internal when calling"</span><span class="plain">);</span>
<span class="functiontext">Locations::EILT_at</span><span class="plain">(</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">, </span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">]);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">inter_resources</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Inter"</span><span class="plain">);</span>
<span class="identifier">filename_of_default_inter_pipeline</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inter_resources</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"default.interpipeline"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Miscellaneous other stuff</span> <span class="cwebmacronumber">6.1.1</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_1_1"></a><b>&#167;6.1.1. </b>Most of these files are to help Inblorb to perform a release. The
documentation models are used when making extension documentation; the
leafname is platform-dependent so that Windows can use different models
from everybody else.
</p>
<p class="inwebparagraph">The documentation snippets file is generated by <code class="display"><span class="extract">indoc</span></code> and contains
brief specifications of phrases, extracted from the manual "Writing with
Inform". This is used to generate the Phrasebook index.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Miscellaneous other stuff</span> <span class="cwebmacronumber">6.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">misc</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Miscellany"</span><span class="plain">);</span>
<span class="identifier">filename_of_large_default_cover_art</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">misc</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Cover.jpg"</span><span class="plain">);</span>
<span class="identifier">filename_of_small_default_cover_art</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">misc</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Small Cover.jpg"</span><span class="plain">);</span>
<span class="identifier">filename_of_intro_postcard</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">misc</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Postcard.pdf"</span><span class="plain">);</span>
<span class="identifier">filename_of_intro_booklet</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">misc</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"IntroductionToIF.pdf"</span><span class="plain">);</span>
<span class="identifier">pathname_of_HTML_models</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">INTERNAL_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"HTML"</span><span class="plain">);</span>
<span class="identifier">filename_of_cblorb_report_model</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_HTML_models</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"CblorbModel.html"</span><span class="plain">);</span>
<span class="identifier">filename_of_xrefs</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_HTML_models</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"xrefs.txt"</span><span class="plain">);</span>
<span class="identifier">filename_of_documentation_snippets</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">misc</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"definitions.html"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_1">&#167;6.1</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. External resources. </b>This is where the user can install downloaded extensions, new interpreters,
website templates and so on; so-called "permanent" external resources, since
the user expects them to stay put once installed. But there is also a
"transient" external resources area, for more ephemeral content, such as
the mechanically generated extension documentation. On most platforms the
permanent and transient external areas will be the same, but some mobile
operating systems are aggressive about wanting to delete ephemeral files
used by applications.
</p>
<p class="inwebparagraph">The locations of the permanent and transient external folders can be set
using <code class="display"><span class="extract">-external</span></code> and <code class="display"><span class="extract">-transient</span></code> respectively. If no <code class="display"><span class="extract">-external</span></code> is
specified, the location depends on the platform settings: for example on
Mac OS X it will typically be
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">/Library/Users/hclinton/Library/Inform</span>
</pre>
<p class="inwebparagraph">If <code class="display"><span class="extract">-transient</span></code> is not specified, it's the same folder, i.e., Inform does
not distinguish between permanent and transient external resources.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">External resources</span> <span class="cwebmacronumber">6.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">] = </span><span class="identifier">home_path</span><span class="plain">;</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">subfolder_within</span><span class="plain"> = </span><span class="identifier">INFORM_FOLDER_RELATIVE_TO_HOME</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">subfolder_within</span><span class="plain">[0]) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">SF</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SF</span><span class="plain">, </span><span class="string">"%s"</span><span class="plain">, </span><span class="identifier">subfolder_within</span><span class="plain">);</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">home_path</span><span class="plain">, </span><span class="identifier">SF</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">SF</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">] =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Inform"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">]) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Permanent external resources</span> <span class="cwebmacronumber">6.2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_transient_external_resources</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">pathname_of_transient_external_resources</span><span class="plain"> =</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_transient_external_resources</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Transient external resources</span> <span class="cwebmacronumber">6.2.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_2_1"></a><b>&#167;6.2.1. </b>The permanent resources are read-only as far as we are concerned. (The
user interface application, and the user directly, write to this area when
they (say) install new extensions. But the compiler only reads.)
</p>
<p class="inwebparagraph">Once again we have a set of EILT resources, but we also have a curiosity:
a useful little file to add source text to everything Inform compiles,
generally to set use options.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Permanent external resources</span> <span class="cwebmacronumber">6.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Locations::EILT_at</span><span class="plain">(</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">, </span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">]);</span>
<span class="identifier">filename_of_options</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">EXTERNAL_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Options.txt"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_2">&#167;6.2</a>.</p>
<p class="inwebparagraph"><a id="SP6_2_2"></a><b>&#167;6.2.2. </b>The transient resources are all written by us.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Transient external resources</span> <span class="cwebmacronumber">6.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
&lt;<span class="cwebmacro">Transient documentation</span> <span class="cwebmacronumber">6.2.2.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Transient telemetry</span> <span class="cwebmacronumber">6.2.2.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_2">&#167;6.2</a>.</p>
<p class="inwebparagraph"><a id="SP6_2_2_1"></a><b>&#167;6.2.2.1. </b>The documentation folder is in effect a little website of its own, generated
automatically by Inform. There'll be some files at the top level, and then
there are files on each extension, in suitable subfolders. The census data
subfolder is not browsable or linked to, but holds working files needed when
assembling all this.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Transient documentation</span> <span class="cwebmacronumber">6.2.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname_of_extension_docs</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_transient_external_resources</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Documentation"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_extension_docs</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">pathname_of_transient_census_data</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_extension_docs</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Census"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_transient_census_data</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">filename_of_extensions_dictionary</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_transient_census_data</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Dictionary.txt"</span><span class="plain">);</span>
<span class="identifier">pathname_of_extension_docs_inner</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_extension_docs</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Extensions"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_extension_docs_inner</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_2_2">&#167;6.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP6_2_2_2"></a><b>&#167;6.2.2.2. </b>Telemetry is not as sinister as it sounds: the app isn't sending data out
on the Internet, only (if requested) logging what it's doing to a local file.
This was provided for classroom use, so that teachers can see what their
students have been getting stuck on.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Transient telemetry</span> <span class="cwebmacronumber">6.2.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_telemetry_data</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_transient_external_resources</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Telemetry"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_telemetry_data</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leafname_of_telemetry</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">this_month</span><span class="plain"> = </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mon</span><span class="plain"> + 1;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">this_day</span><span class="plain"> = </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mday</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">this_year</span><span class="plain"> = </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_year</span><span class="plain"> + 1900;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leafname_of_telemetry</span><span class="plain">,</span>
<span class="string">"Telemetry %04d-%02d-%02d.txt"</span><span class="plain">, </span><span class="identifier">this_year</span><span class="plain">, </span><span class="identifier">this_month</span><span class="plain">, </span><span class="identifier">this_day</span><span class="plain">);</span>
<span class="identifier">filename_of_telemetry</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_telemetry_data</span><span class="plain">, </span><span class="identifier">leafname_of_telemetry</span><span class="plain">);</span>
<span class="identifier">Telemetry::locate_telemetry_file</span><span class="plain">(</span><span class="identifier">filename_of_telemetry</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leafname_of_telemetry</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_2_2">&#167;6.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP6_3"></a><b>&#167;6.3. Project resources. </b>Although on some platforms it may look like a single file, an Inform project
is a folder whose name has the dot-extension <code class="display"><span class="extract">.inform</span></code>. We'll call this the
"project folder", and it contains a whole bundle of useful files.
</p>
<p class="inwebparagraph">The UUID file records an ISBN-like identifying number for the project. This
is read-only for us.
</p>
<p class="inwebparagraph">The iFiction record, manifest and blurb file are all files that we generate
to give instructions to the releasing agent Inblorb. This means that they
have no purpose unless Inform is in a release run (with <code class="display"><span class="extract">-release</span></code> set on
the command line), but they take no time to generate so we make them anyway.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Project resources</span> <span class="cwebmacronumber">6.3</span>&gt; =
</code></p>
<pre class="displaydefn">
&lt;<span class="cwebmacro">The Source folder within the project</span> <span class="cwebmacronumber">6.3.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">The Build folder within the project</span> <span class="cwebmacronumber">6.3.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">The Index folder within the project</span> <span class="cwebmacronumber">6.3.3</span>&gt;<span class="plain">;</span>
<span class="identifier">filename_of_uuid</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"uuid.txt"</span><span class="plain">);</span>
<span class="identifier">filename_of_ifiction_record</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Metadata.iFiction"</span><span class="plain">);</span>
<span class="identifier">filename_of_manifest</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"manifest.plist"</span><span class="plain">);</span>
<span class="identifier">filename_of_blurb</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Release.blurb"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_3_1"></a><b>&#167;6.3.1. </b>This contains just the main source text for the project. Anachronistically,
this has the filename extension <code class="display"><span class="extract">.ni</span></code> for "natural Inform", which was the
working title for Inform 7 back in the early 2000s.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">The Source folder within the project</span> <span class="cwebmacronumber">6.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">filename_of_i7_source</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_project</span><span class="plain">)</span>
<span class="identifier">filename_of_i7_source</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Source"</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"story.ni"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_3">&#167;6.3</a>.</p>
<p class="inwebparagraph"><a id="SP6_3_2"></a><b>&#167;6.3.2. </b>The build folder for a project contains all of the working files created
during the compilation process. The opening part here may be a surprise:
In extension census mode, Inform is running not to compile something but to
extract details of all the extensions installed. But it still needs somewhere
to write its temporary and debugging files, and there is no project bundle
to write into. To get round this, we use the census data area as if it
were indeed a project bundle.
</p>
<p class="inwebparagraph">Briefly: we aim to compile the source text to an Inform 6 program; we issue
an HTML report on our success or failure, listing problem messages if they
occurred; we track our progress in the debugging log. We don't produce the
story file ourselves, I6 will do that, but we do need to know what it's
called; and similarly for the report which the releasing tool Inblorb
will produce if this is a Release run.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">The Build folder within the project</span> <span class="cwebmacronumber">6.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">build_folder</span><span class="plain"> = </span><span class="identifier">pathname_of_transient_census_data</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">census_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">build_folder</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">filename_of_report</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Problems.html"</span><span class="plain">);</span>
<span class="identifier">filename_of_debugging_log</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Debug log.txt"</span><span class="plain">);</span>
<span class="identifier">filename_of_parse_tree</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Parse tree.txt"</span><span class="plain">);</span>
<span class="identifier">filename_of_compiled_i6_code</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"auto.inf"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">, </span><span class="string">"output.%S"</span><span class="plain">, </span><span class="identifier">story_filename_extension</span><span class="plain">);</span>
<span class="identifier">filename_of_story_file</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">story_file_leafname</span><span class="plain">);</span>
<span class="identifier">filename_of_cblorb_report</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"StatusCblorb.html"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_3">&#167;6.3</a>.</p>
<p class="inwebparagraph"><a id="SP6_3_3"></a><b>&#167;6.3.3. </b>We're going to write into the Index folder, so we must ensure it exists.
The main index files (<code class="display"><span class="extract">Phrasebook.html</span></code> and so on) live at the top level,
details on actions live in the subfolder <code class="display"><span class="extract">Details</span></code>: see below.
</p>
<p class="inwebparagraph">An oddity in the Index folder is an XML file recording where the headings
are in the source text: this is for the benefit of the user interface
application, if it wants it, but is not linked to or used by the HTML of
the index as seen by the user.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">The Index folder within the project</span> <span class="cwebmacronumber">6.3.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname_of_project_index_folder</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Index"</span><span class="plain">);</span>
<span class="identifier">pathname_of_project_index_details_folder</span><span class="plain"> =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Details"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">census_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_folder</span><span class="plain">) == 0) ||</span>
<span class="plain">(</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_details_folder</span><span class="plain">) == 0))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">filename_of_headings</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Headings.xml"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_3">&#167;6.3</a>.</p>
<p class="inwebparagraph"><a id="SP6_4"></a><b>&#167;6.4. Materials resources. </b>The materials folder sits alongside the project folder and has the same name,
but ending <code class="display"><span class="extract">.materials</span></code> instead of <code class="display"><span class="extract">.inform</span></code>.
</p>
<p class="inwebparagraph">For the third and final time, there are EILT resources.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Materials resources</span> <span class="cwebmacronumber">6.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_project</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">Pathnames::directory_name</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">));</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">)-1;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain">&gt;0) &amp;&amp; (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) != </span><span class="character">'.'</span><span class="plain">)) </span><span class="identifier">i</span><span class="plain">--;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">&gt;0) {</span>
<span class="identifier">Str::truncate</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">, </span><span class="string">".materials"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">] =</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_project</span><span class="plain">-&gt;</span><span class="identifier">pathname_of_parent</span><span class="plain">, </span><span class="identifier">mf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">mf</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">]) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">] = </span><span class="identifier">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inform.materials"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Locations::EILT_at</span><span class="plain">(</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">, </span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">]);</span>
&lt;<span class="cwebmacro">Figures and sounds</span> <span class="cwebmacronumber">6.4.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">The Release folder</span> <span class="cwebmacronumber">6.4.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Existing story file</span> <span class="cwebmacronumber">6.4.3</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_4_1"></a><b>&#167;6.4.1. </b>This is where cover art lives: it could have either the file extension <code class="display"><span class="extract">.jpg</span></code>
or <code class="display"><span class="extract">.png</span></code>, and we generate both sets of filenames, even though at most one will
actually work. This is also where we generate the EPS file of the map, if
so requested; a bit anomalously, it's the only file in Materials but outside
Release which we write to.
</p>
<p class="inwebparagraph">This is also where the originals (not the released copies) of the Figures
and Sounds, if any, live: in their own subfolders.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Figures and sounds</span> <span class="cwebmacronumber">6.4.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname_of_materials_figures</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="identifier">pathname_of_materials_sounds</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Sounds"</span><span class="plain">);</span>
<span class="identifier">filename_of_large_cover_art_jpeg</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Cover.jpg"</span><span class="plain">);</span>
<span class="identifier">filename_of_large_cover_art_png</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Cover.png"</span><span class="plain">);</span>
<span class="identifier">filename_of_small_cover_art_jpeg</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Small Cover.jpg"</span><span class="plain">);</span>
<span class="identifier">filename_of_small_cover_art_png</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Small Cover.png"</span><span class="plain">);</span>
<span class="identifier">filename_of_epsfile</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Inform Map.eps"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_4">&#167;6.4</a>.</p>
<p class="inwebparagraph"><a id="SP6_4_2"></a><b>&#167;6.4.2. </b>On a release run, Inblorb will populate the Release subfolder of Materials;
figures and sounds will be copied into the relevant subfolders. The principle
is that everything in Release can always be thrown away without loss, because
it can all be generated again.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">The Release folder</span> <span class="cwebmacronumber">6.4.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pathname_of_materials_release</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">I</span><span class="string">"Release"</span><span class="plain">);</span>
<span class="identifier">pathname_of_released_interpreter</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_materials_release</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"interpreter"</span><span class="plain">);</span>
<span class="identifier">pathname_of_released_figures</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_materials_release</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="identifier">pathname_of_released_sounds</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_materials_release</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sounds"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_4">&#167;6.4</a>.</p>
<p class="inwebparagraph"><a id="SP6_4_3"></a><b>&#167;6.4.3. </b>Inform is occasionally run in a mode where it performs a release on an
existing story file (for example a 1980s Infocom one) rather than on one
that it has newly generated. This is the filename such a story file would
have by default, if so.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Existing story file</span> <span class="cwebmacronumber">6.4.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"story.%S"</span><span class="plain">, </span><span class="identifier">story_filename_extension</span><span class="plain">);</span>
<span class="identifier">filename_of_existing_story_file</span><span class="plain"> =</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_area</span><span class="plain">[</span><span class="constant">MATERIALS_FS_AREA</span><span class="plain">], </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_4">&#167;6.4</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. EILTs. </b>Each of the materials folder, the internal and external areas has a suite
of subfolders to hold I7 extensions (in an author tree: see below), I6
template files, language definitions and website templates.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Locations::EILT_at</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">area</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="identifier">pathname_of_extensions</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Extensions"</span><span class="plain">);</span>
<span class="identifier">pathname_of_languages</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Languages"</span><span class="plain">);</span>
<span class="identifier">pathname_of_website_templates</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Templates"</span><span class="plain">);</span>
<span class="identifier">pathname_of_inter_resources</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">] = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Inter"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::EILT_at is used in <a href="#SP6_1">&#167;6.1</a>, <a href="#SP6_2_1">&#167;6.2.1</a>, <a href="#SP6_4">&#167;6.4</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Location of extensions. </b>When Inform needs one of the EILT resources, it now has three places to look:
the internal resources folder, the external one, and the materials folder.
In fact, it checks them in reverse order, thus allowing the user to override
default resources.
</p>
<p class="inwebparagraph">To take the E part, within an Extensions folder, the extensions are stored
within subfolders named for their authors:
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">Extensions</span>
<span class="plain"> Emily Short</span>
<span class="plain"> Locksmith.i7x</span>
</pre>
<p class="inwebparagraph">This is now very much deprecated, but at one time the filename extension
<code class="display"><span class="extract">.i7x</span></code> was optional.
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Locations::of_extension</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">author</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i7x_flag</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i7x_flag</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S.i7x"</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">author</span><span class="plain">), </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">F</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::of_extension is used in 3/rst (<a href="3-rst.html#SP6_1">&#167;6.1</a>), 8/ec (<a href="8-ec.html#SP5_2_2_1">&#167;5.2.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Documentation is similarly arranged:
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Locations::of_extension_documentation</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">author</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S.html"</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_extension_docs_inner</span><span class="plain">, </span><span class="identifier">author</span><span class="plain">), </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">F</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::of_extension_documentation is used in 8/ed2 (<a href="8-ed2.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Location of index files. </b>Filenames within the <code class="display"><span class="extract">Index</span></code> subfolder. Filenames in <code class="display"><span class="extract">Details</span></code> have the form
<code class="display"><span class="extract">N_S</span></code> where <code class="display"><span class="extract">N</span></code> is the integer supplied and <code class="display"><span class="extract">S</span></code> the leafname; for instance,
<code class="display"><span class="extract">21_A.html</span></code> provides details page number 21 about actions, derived from the
leafname <code class="display"><span class="extract">A.html</span></code>.
</p>
<pre class="display">
<span class="identifier">filename</span><span class="plain"> *</span><span class="functiontext">Locations::in_index</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sub</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pathname_of_project</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sub</span><span class="plain"> &gt;= 0) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">full_leafname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">full_leafname</span><span class="plain">, </span><span class="string">"%d_%S"</span><span class="plain">, </span><span class="identifier">sub</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_details_folder</span><span class="plain">, </span><span class="identifier">full_leafname</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">full_leafname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">F</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_project_index_folder</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Locations::in_index appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-pp.html">Back to 'Progress Percentages'</a></li><li><i>(This section ends Chapter 1: Configuration and Control.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '1/wtc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>What To Compile</b></li></ul><p class="purpose">To receive an instruction to compile something from Inbuild, and then to sort out the many locations then used in the host filing system.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>What To Compile</b></li></ul><p class="purpose">To receive an instruction to compile something from Inbuild, and then to sort out the many locations then used in the host filing system.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Task data</a></li><li><a href="#SP9">&#167;9. Project-related files and file paths</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '10/aots' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Architecture of the S-Parser</b></li></ul><p class="purpose">Top-level structure of the S-parser, which turns text into S-nodes.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Architecture of the S-Parser</b></li></ul><p class="purpose">Top-level structure of the S-parser, which turns text into S-nodes.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Introduction</a></li><li><a href="#SP3">&#167;3. Top-level nonterminals</a></li><li><a href="#SP11">&#167;11. The cache</a></li><li><a href="#SP15">&#167;15. Void phrases</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '10/cad' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Constants and Descriptions</b></li></ul><p class="purpose">To parse noun phrases in constant contexts, which specify values either explicitly or by describing them more or less vaguely.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Constants and Descriptions</b></li></ul><p class="purpose">To parse noun phrases in constant contexts, which specify values either explicitly or by describing them more or less vaguely.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Constant values</a></li><li><a href="#SP8">&#167;8. Adjective lists</a></li><li><a href="#SP19">&#167;19. Descriptions</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '10/cap' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Conditions and Phrases</b></li></ul><p class="purpose">To parse the text of To... phrases, say phrases and conditions.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Conditions and Phrases</b></li></ul><p class="purpose">To parse the text of To... phrases, say phrases and conditions.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Conditions</a></li><li><a href="#SP9">&#167;9. Command phrases</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '10/pl' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Parse Literals</b></li></ul><p class="purpose">To decide if an excerpt of text is a value referred to notationally rather than by name.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Parse Literals</b></li></ul><p class="purpose">To decide if an excerpt of text is a value referred to notationally rather than by name.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Literals in the S-grammar</a></li><li><a href="#SP2">&#167;2. Response letters</a></li><li><a href="#SP3">&#167;3. Truth states</a></li><li><a href="#SP5">&#167;5. Real numbers</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '10/teav' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Type Expressions and Values</b></li></ul><p class="purpose">To parse two forms of noun: a noun phrase in a sentence, and a description of what text can be written in a given situation.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Type Expressions and Values</b></li></ul><p class="purpose">To parse two forms of noun: a noun phrase in a sentence, and a description of what text can be written in a given situation.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP3">&#167;3. Type expressions</a></li><li><a href="#SP10">&#167;10. Values</a></li><li><a href="#SP14">&#167;14. Variables</a></li><li><a href="#SP21">&#167;21. Table references</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '10/varc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Verbal and Relative Clauses</b></li></ul><p class="purpose">To break down an excerpt into NP and VP-like clauses, perhaps with a primary verb (to make a sentence), perhaps only a relative clause (to make a more complex NP).</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#10">Chapter 10: The S-Parser</a></li><li><b>Verbal and Relative Clauses</b></li></ul><p class="purpose">To break down an excerpt into NP and VP-like clauses, perhaps with a primary verb (to make a sentence), perhaps only a relative clause (to make a more complex NP).</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP3">&#167;3. The top level of the S-grammar</a></li><li><a href="#SP9">&#167;9. Tidying up a sentence subtree</a></li><li><a href="#SP10">&#167;10. Values as noun phrases</a></li><li><a href="#SP13">&#167;13. Junction</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '11/ap' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Atomic Propositions</b></li></ul><p class="purpose">To build and modify atoms, the syntactic pieces from which propositions are built up.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Atomic Propositions</b></li></ul><p class="purpose">To build and modify atoms, the syntactic pieces from which propositions are built up.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP5">&#167;5. The elements</a></li><li><a href="#SP7">&#167;7. Creating atoms</a></li><li><a href="#SP8">&#167;8. The STRUCTURAL group</a></li><li><a href="#SP11">&#167;11. The PREDICATES group</a></li><li><a href="#SP24">&#167;24. Validating atoms</a></li><li><a href="#SP25">&#167;25. Debugging log</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '11/bas' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Binding and Substitution</b></li></ul><p class="purpose">To substitute constants into propositions in place of variables, and to apply quantifiers to bind any unbound variables.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Binding and Substitution</b></li></ul><p class="purpose">To substitute constants into propositions in place of variables, and to apply quantifiers to bind any unbound variables.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP4">&#167;4. Well-formedness</a></li><li><a href="#SP9">&#167;9. Renumbering</a></li><li><a href="#SP12">&#167;12. Binding</a></li><li><a href="#SP13">&#167;13. Substitution</a></li><li><a href="#SP16">&#167;16. A footnote on variable 0</a></li><li><a href="#SP19">&#167;19. Detect locals</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '11/itpc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Introduction to Predicate Calculus</b></li></ul><p class="purpose">An exposition of the form of predicate calculus used by Inform.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Introduction to Predicate Calculus</b></li></ul><p class="purpose">An exposition of the form of predicate calculus used by Inform.</p>
<ul class="toc"><li><a href="#SP2">&#167;2. Why predicate calculus</a></li><li><a href="#SP4">&#167;4. Formal description</a></li><li><a href="#SP7">&#167;7. Free and bound variables, well-formedness</a></li><li><a href="#SP8">&#167;8. The scope of quantifiers</a></li><li><a href="#SP10">&#167;10. What is not in our calculus</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '11/pr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Propositions</b></li></ul><p class="purpose">To build and modify structures representing propositions in predicate calculus.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Propositions</b></li></ul><p class="purpose">To build and modify structures representing propositions in predicate calculus.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP7">&#167;7. Implied conjunction</a></li><li><a href="#SP10">&#167;10. Validity</a></li><li><a href="#SP13">&#167;13. Complexity</a></li><li><a href="#SP14">&#167;14. Primitive operations on propositions</a></li><li><a href="#SP17">&#167;17. Inserting and deleting atoms</a></li><li><a href="#SP19">&#167;19. Inspecting contents</a></li><li><a href="#SP20">&#167;20. Matching sequences of atoms</a></li><li><a href="#SP21">&#167;21. Seeking atoms</a></li><li><a href="#SP29">&#167;29. Bracketed groups</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '11/sc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Sentence Conversions</b></li></ul><p class="purpose">The third of the three sources of propositions to conjure with: those which arise by the parsing of complex sentence trees in the S-grammar.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Sentence Conversions</b></li></ul><p class="purpose">The third of the three sources of propositions to conjure with: those which arise by the parsing of complex sentence trees in the S-grammar.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. The meaning of a sentence</a></li><li><a href="#SP1_14">&#167;1.14. Simplification</a></li><li><a href="#SP3">&#167;3. The meaning of a noun phrase</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '11/sm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Simplifications</b></li></ul><p class="purpose">A set of operations each of which takes a proposition and either leaves it unchanged or replaces it with a simpler one logically equivalent to the original.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Simplifications</b></li></ul><p class="purpose">A set of operations each of which takes a proposition and either leaves it unchanged or replaces it with a simpler one logically equivalent to the original.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP3">&#167;3. Simplify the nothing constant (fudge)</a></li><li><a href="#SP4">&#167;4. Use listed-in predicates (deduction)</a></li><li><a href="#SP5">&#167;5. Simplify negated determiners (deduction)</a></li><li><a href="#SP7">&#167;7. Simplify negated satisfiability (deduction)</a></li><li><a href="#SP8">&#167;8. Make kind requirements explicit (deduction)</a></li><li><a href="#SP9">&#167;9. Remove redundant kind predicates (deduction)</a></li><li><a href="#SP11">&#167;11. Turn binary predicates the right way round (deduction)</a></li><li><a href="#SP12">&#167;12. Simplify region containment (fudge)</a></li><li><a href="#SP13">&#167;13. Reduce binary predicates (deduction)</a></li><li><a href="#SP14">&#167;14. Eliminating determined variables (deduction)</a></li><li><a href="#SP15">&#167;15. Simplify non-relation (deduction)</a></li><li><a href="#SP16">&#167;16. Convert gerunds to nouns (deduction)</a></li><li><a href="#SP17">&#167;17. Eliminate to have meaning property ownership (fudge)</a></li><li><a href="#SP19">&#167;19. Turn all rooms to everywhere (fudge)</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '11/tc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Tree Conversions</b></li></ul><p class="purpose">The second of the three sources of propositions to conjure with: those which arise from subtrees constructed by the A-parser.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Tree Conversions</b></li></ul><p class="purpose">The second of the three sources of propositions to conjure with: those which arise from subtrees constructed by the A-parser.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Elementary propositions</a></li><li><a href="#SP6">&#167;6. Property setting</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '11/tcp' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Type Check Propositions</b></li></ul><p class="purpose">Predicate calculus is a largely symbolic exercise, and its rules of working tend to assume that all predicates are meaningful for all terms: this means, for instance, that "if blue is 14" is likely to make a well-formed sentence in predicate calculus. In this section we reject such propositions on the grounds that they violate type-checking requirements on relations -- in this example, the equality relation.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Type Check Propositions</b></li></ul><p class="purpose">Predicate calculus is a largely symbolic exercise, and its rules of working tend to assume that all predicates are meaningful for all terms: this means, for instance, that "if blue is 14" is likely to make a well-formed sentence in predicate calculus. In this section we reject such propositions on the grounds that they violate type-checking requirements on relations -- in this example, the equality relation.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP4">&#167;4. Problem reporting kit</a></li><li><a href="#SP6">&#167;6. Type-checking whole propositions</a></li><li><a href="#SP6_1">&#167;6.1. Finding kinds for variables</a></li><li><a href="#SP6_5">&#167;6.5. Type-checking enforced on predicate-like atoms</a></li><li><a href="#SP7">&#167;7. The kind of a term</a></li><li><a href="#SP10">&#167;10. Type-checking predicates</a></li><li><a href="#SP12">&#167;12. Two problem messages needed more than once</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '11/tr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Terms</b></li></ul><p class="purpose">Terms are the representations of values in predicate calculus: variables, constants or functions of other terms.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#11">Chapter 11: Predicate Calculus</a></li><li><b>Terms</b></li></ul><p class="purpose">Terms are the representations of values in predicate calculus: variables, constants or functions of other terms.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP4">&#167;4. Creating new terms</a></li><li><a href="#SP5">&#167;5. Copying</a></li><li><a href="#SP6">&#167;6. Variable letters</a></li><li><a href="#SP7">&#167;7. Underlying terms</a></li><li><a href="#SP8">&#167;8. Adjective-noun conversions</a></li><li><a href="#SP10">&#167;10. Compiling terms</a></li><li><a href="#SP11">&#167;11. Debugging terms</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '12/ap' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Assert Propositions</b></li></ul><p class="purpose">To declare that a given proposition is a true statement about the state of the world when play begins.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Assert Propositions</b></li></ul><p class="purpose">To declare that a given proposition is a true statement about the state of the world when play begins.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP5">&#167;5. Entrance</a></li><li><a href="#SP9">&#167;9. Main procedure</a></li><li><a href="#SP9_5">&#167;9.5. Creations</a></li><li><a href="#SP9_6">&#167;9.6. Asserting kinds</a></li><li><a href="#SP9_7">&#167;9.7. Asserting HERE, NOWHERE and EVERYWHERE</a></li><li><a href="#SP9_10">&#167;9.10. Asserting predicates</a></li><li><a href="#SP11">&#167;11. Evaluating terms</a></li><li><a href="#SP13">&#167;13. Testing at compile-time</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '12/ca' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Compile Atoms</b></li></ul><p class="purpose">In this section, given an atom of a proposition we compile I6 code as required for any of three possible outcomes: (i) to test whether it is true, (ii) to make it henceforth true, or (iii) to make it henceforth false.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Compile Atoms</b></li></ul><p class="purpose">In this section, given an atom of a proposition we compile I6 code as required for any of three possible outcomes: (i) to test whether it is true, (ii) to make it henceforth true, or (iii) to make it henceforth false.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP5_1">&#167;5.1. Stage 1</a></li><li><a href="#SP5_2">&#167;5.2. Stage 2</a></li><li><a href="#SP6">&#167;6. Constructing the schema</a></li><li><a href="#SP8">&#167;8. An unannotated one</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '12/cad' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Cinders and Deferrals</b></li></ul><p class="purpose">To compile terms, having carefully preserved any constants which might have been lost in the process of deferring a proposition (such tricky constants being called "cinders").</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Cinders and Deferrals</b></li></ul><p class="purpose">To compile terms, having carefully preserved any constants which might have been lost in the process of deferring a proposition (such tricky constants being called "cinders").</p>
<ul class="toc"><li><a href="#SP1">&#167;1. About cinders</a></li><li><a href="#SP3">&#167;3. Finding cinders</a></li><li><a href="#SP5">&#167;5. Declaring cinder parameters</a></li><li><a href="#SP6">&#167;6. The kind of terms</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '12/cdp' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Compile Deferred Propositions</b></li></ul><p class="purpose">To compile the I6 routines needed to perform the tests or tasks deferred as being too difficult in their original contexts.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Compile Deferred Propositions</b></li></ul><p class="purpose">To compile the I6 routines needed to perform the tests or tasks deferred as being too difficult in their original contexts.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Comment</a></li><li><a href="#SP2">&#167;2. Preliminaries</a></li><li><a href="#SP2_1_6_1_1">&#167;2.1.6.1.1. The Search</a></li><li><a href="#SP2_1_6_1_2_1">&#167;2.1.6.1.2.1. The R-stack</a></li><li><a href="#SP2_1_6_1_2_3">&#167;2.1.6.1.2.3. Compiling the search</a></li><li><a href="#SP2_1_6_1_2_3_1">&#167;2.1.6.1.2.3.1. Predicate runs and their negations</a></li><li><a href="#SP2_1_6_1_2_3_5">&#167;2.1.6.1.2.3.5. Quantifiers and the Q-stack</a></li><li><a href="#SP2_1_6_1_2_3_8">&#167;2.1.6.1.2.3.8. The C-stack</a></li><li><a href="#SP2_1_5_1">&#167;2.1.5.1. Adaptations</a></li><li><a href="#SP2_1_6_1_3">&#167;2.1.6.1.3. Adaptation to CONDITION</a></li><li><a href="#SP2_1_6_1_5">&#167;2.1.6.1.5. Adaptation to NUMBER</a></li><li><a href="#SP2_1_6_1_8">&#167;2.1.6.1.8. Adaptation to LIST</a></li><li><a href="#SP2_1_6_1_10">&#167;2.1.6.1.10. Adaptation to RANDOM</a></li><li><a href="#SP2_1_6_1_12">&#167;2.1.6.1.12. Adaptation to TOTAL</a></li><li><a href="#SP2_1_6_1_14">&#167;2.1.6.1.14. Adaptation to EXTREMAL</a></li><li><a href="#SP2_1_6_1_16">&#167;2.1.6.1.16. Adaptation to LOOP</a></li><li><a href="#SP3">&#167;3. Compiling loop headers</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '12/dtd' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Deciding to Defer</b></li></ul><p class="purpose">To decide whether a proposition can be compiled immediately, in the body of the current routine, or whether it must be deferred to a routine of its own, which is called from the current routine.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Deciding to Defer</b></li></ul><p class="purpose">To decide whether a proposition can be compiled immediately, in the body of the current routine, or whether it must be deferred to a routine of its own, which is called from the current routine.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP3">&#167;3. The guillotine</a></li><li><a href="#SP4">&#167;4. Deferral requests</a></li><li><a href="#SP7">&#167;7. Testing, or deferring a test</a></li><li><a href="#SP11">&#167;11. Forcing with now, or deferring the force</a></li><li><a href="#SP12">&#167;12. Multipurpose descriptions</a></li><li><a href="#SP23">&#167;23. Domains of loops</a></li><li><a href="#SP28">&#167;28. Checking the validity of a description</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '12/is' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>I6 Schemas</b></li></ul><p class="purpose">To create, and later expand upon, short prototypes of I6 syntax for such run-time tasks as the setting, unsetting or testing of a relation.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>I6 Schemas</b></li></ul><p class="purpose">To create, and later expand upon, short prototypes of I6 syntax for such run-time tasks as the setting, unsetting or testing of a relation.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP4">&#167;4. Building schemas</a></li><li><a href="#SP5">&#167;5. Emptiness</a></li><li><a href="#SP6">&#167;6. Expansion</a></li><li><a href="#SP10">&#167;10. Logging schemas</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '12/qr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Quasinumeric Relations</b></li></ul><p class="purpose">To define the binary predicates corresponding to numerical comparisons.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>Quasinumeric Relations</b></li></ul><p class="purpose">To define the binary predicates corresponding to numerical comparisons.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP3">&#167;3. Initial stock</a></li><li><a href="#SP4">&#167;4. Second stock</a></li><li><a href="#SP5">&#167;5. Typechecking</a></li><li><a href="#SP6">&#167;6. Assertion</a></li><li><a href="#SP7">&#167;7. Compilation</a></li><li><a href="#SP8">&#167;8. Problem message text</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '12/ter' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>The Equality Relation</b></li></ul><p class="purpose">To define that prince among predicates, the equality relation.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>The Equality Relation</b></li></ul><p class="purpose">To define that prince among predicates, the equality relation.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP3">&#167;3. Initial stock</a></li><li><a href="#SP4">&#167;4. Second stock</a></li><li><a href="#SP5">&#167;5. Typechecking</a></li><li><a href="#SP7">&#167;7. Assertion</a></li><li><a href="#SP8">&#167;8. Compilation</a></li><li><a href="#SP9">&#167;9. Problem message text</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '13/ca' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#13">Chapter 13: Bridge to Kinds Module</a></li><li><b>Compile Arithmetic</b></li></ul><p class="purpose">To compile code performing an arithmetic operation.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#13">Chapter 13: Bridge to Kinds Module</a></li><li><b>Compile Arithmetic</b></li></ul><p class="purpose">To compile code performing an arithmetic operation.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Compiling arithmetic</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '13/kak' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#13">Chapter 13: Bridge to Kinds Module</a></li><li><b>Knowledge about Kinds</b></li></ul><p class="purpose">How kinds can be inference subjects.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#13">Chapter 13: Bridge to Kinds Module</a></li><li><b>Knowledge about Kinds</b></li></ul><p class="purpose">How kinds can be inference subjects.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. </a></li><li><a href="#SP7">&#167;7. Problems with kinds</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '13/ki' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#13">Chapter 13: Bridge to Kinds Module</a></li><li><b>Kinds Index</b></li></ul><p class="purpose">To produce most of the Kinds page in the Index for a project: the chart at the top, and the detailed entries below.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#13">Chapter 13: Bridge to Kinds Module</a></li><li><b>Kinds Index</b></li></ul><p class="purpose">To produce most of the Kinds page in the Index for a project: the chart at the top, and the detailed entries below.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Indexing the kinds</a></li><li><a href="#SP2">&#167;2. Kind table construction</a></li><li><a href="#SP6">&#167;6. Indexing kind names</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '13/rsfk' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#13">Chapter 13: Bridge to Kinds Module</a></li><li><b>Runtime Support for Kinds</b></li></ul><p class="purpose">To compile I6 material needed at runtime to enable kinds to function as they should.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#13">Chapter 13: Bridge to Kinds Module</a></li><li><b>Runtime Support for Kinds</b></li></ul><p class="purpose">To compile I6 material needed at runtime to enable kinds to function as they should.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP3">&#167;3. Kinds as I6 classes</a></li><li><a href="#SP4">&#167;4. Default values</a></li><li><a href="#SP6">&#167;6. Equality tests</a></li><li><a href="#SP7">&#167;7. Casts at runtime</a></li><li><a href="#SP8">&#167;8. IDs</a></li><li><a href="#SP17">&#167;17. The heap</a></li><li><a href="#SP21">&#167;21. Run-time support for units and enumerations</a></li><li><a href="#SP24_6">&#167;24.6. Further runtime support</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '14/cfs' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Compiling from Specifications</b></li></ul><p class="purpose">To compile specifications into Inform 6 values, conditions or void expressions.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Compiling from Specifications</b></li></ul><p class="purpose">To compile specifications into Inform 6 values, conditions or void expressions.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '14/cn' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Conditions</b></li></ul><p class="purpose">Utility functions for condition nodes.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Conditions</b></li></ul><p class="purpose">Utility functions for condition nodes.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Creation</a></li><li><a href="#SP12">&#167;12. Pretty-printing</a></li><li><a href="#SP14">&#167;14. Specificity</a></li><li><a href="#SP16">&#167;16. Compiling</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '14/ds' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Descriptions</b></li></ul><p class="purpose">Description nodes represent text such as "even numbers", which can either define a set of values or a predicate on them.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Descriptions</b></li></ul><p class="purpose">Description nodes represent text such as "even numbers", which can either define a set of values or a predicate on them.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Descriptions vs propositions</a></li><li><a href="#SP3">&#167;3. Descriptions vs kinds</a></li><li><a href="#SP5">&#167;5. Descriptions vs instances</a></li><li><a href="#SP6">&#167;6. Descriptions vs constants</a></li><li><a href="#SP7">&#167;7. Testing</a></li><li><a href="#SP8">&#167;8. Adjectives</a></li><li><a href="#SP9">&#167;9. Quantification</a></li><li><a href="#SP10">&#167;10. Callings</a></li><li><a href="#SP11">&#167;11. Pretty-printing</a></li><li><a href="#SP12">&#167;12. Comparing</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '14/ds2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Dash</b></li></ul><p class="purpose">Dash is the part of Inform most nearly like a typechecker in a conventional compiler.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Dash</b></li></ul><p class="purpose">Dash is the part of Inform most nearly like a typechecker in a conventional compiler.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP4">&#167;4. The Dashboard</a></li><li><a href="#SP8">&#167;8. Return values</a></li><li><a href="#SP9">&#167;9. (1) Entering Dash</a></li><li><a href="#SP10">&#167;10. (2) Recursion point</a></li><li><a href="#SP11">&#167;11. (3) Context switching</a></li><li><a href="#SP11_8">&#167;11.8. New variables</a></li><li><a href="#SP11_9">&#167;11.9. (4) Typechecking within current context</a></li><li><a href="#SP11_9_1_2">&#167;11.9.1.2. (4S) Verifying single non-invocation readings</a></li><li><a href="#SP13">&#167;13. Arithmetic operands</a></li><li><a href="#SP14">&#167;14. Local variable markers</a></li><li><a href="#SP15">&#167;15. Problems, problems, problems</a></li><li><a href="#SP19">&#167;19. (5) Single nodes</a></li><li><a href="#SP19_2">&#167;19.2. Rule (5.a)</a></li><li><a href="#SP19_3">&#167;19.3. Rule (5.b)</a></li><li><a href="#SP19_4">&#167;19.4. Rule (5.c)</a></li><li><a href="#SP19_5">&#167;19.5. Rule (5.d)</a></li><li><a href="#SP19_6">&#167;19.6. Rule (5.e)</a></li><li><a href="#SP22">&#167;22. Ambiguity testing flags</a></li><li><a href="#SP27">&#167;27. Value checking</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '14/lv' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Lvalues</b></li></ul><p class="purpose">Utility functions for specifications representing lvalues, that is, storage locations for values at run-time.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Lvalues</b></li></ul><p class="purpose">Utility functions for specifications representing lvalues, that is, storage locations for values at run-time.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Creation</a></li><li><a href="#SP7">&#167;7. Testing</a></li><li><a href="#SP10">&#167;10. Pretty-printing</a></li><li><a href="#SP12">&#167;12. Compilation</a></li><li><a href="#SP14">&#167;14. Rvalue compilation</a></li><li><a href="#SP15">&#167;15. Lvalue compilation</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '14/rv' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>RValues</b></li></ul><p class="purpose">Utility functions for specifications representing rvalues.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>RValues</b></li></ul><p class="purpose">Utility functions for specifications representing rvalues.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Constants</a></li><li><a href="#SP7">&#167;7. Literals as rvalues</a></li><li><a href="#SP17">&#167;17. Pairs</a></li><li><a href="#SP18">&#167;18. Constant descriptions</a></li><li><a href="#SP19">&#167;19. Testing</a></li><li><a href="#SP21">&#167;21. Pretty-printing</a></li><li><a href="#SP23">&#167;23. Compilation</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '14/sp' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Specifications</b></li></ul><p class="purpose">To create, manage and compare specifications.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#14">Chapter 14: Specifications</a></li><li><b>Specifications</b></li></ul><p class="purpose">To create, manage and compare specifications.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Kinds vs specifications</a></li><li><a href="#SP6">&#167;6. Pretty-printing specifications</a></li><li><a href="#SP7">&#167;7. Sorting</a></li><li><a href="#SP8">&#167;8. The Unknown</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '15/cp' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Condition Properties</b></li></ul><p class="purpose">Properties which hold one of an enumerated set of named states of something.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Condition Properties</b></li></ul><p class="purpose">Properties which hold one of an enumerated set of named states of something.</p>
<ul class="toc"><li><a href="#SP5">&#167;5. Coincidence</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '15/cr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Comparative Relations</b></li></ul><p class="purpose">When a measurement adjective like "tall" is defined, so is a comparative relation like "taller than".</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Comparative Relations</b></li></ul><p class="purpose">When a measurement adjective like "tall" is defined, so is a comparative relation like "taller than".</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP3">&#167;3. Initial stock</a></li><li><a href="#SP4">&#167;4. Second stock</a></li><li><a href="#SP5">&#167;5. Typechecking</a></li><li><a href="#SP6">&#167;6. Assertion</a></li><li><a href="#SP7">&#167;7. Compilation</a></li><li><a href="#SP8">&#167;8. Problem message text</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '15/ep' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Either-Or Properties</b></li></ul><p class="purpose">Properties which can either be present or not, but have no value attached.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Either-Or Properties</b></li></ul><p class="purpose">Properties which can either be present or not, but have no value attached.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. A design choice</a></li><li><a href="#SP3">&#167;3. Requesting new named properties</a></li><li><a href="#SP4">&#167;4. Requesting new nameless properties</a></li><li><a href="#SP5">&#167;5. Initialising details</a></li><li><a href="#SP9">&#167;9. Assertion</a></li><li><a href="#SP10">&#167;10. Compilation</a></li><li><a href="#SP12">&#167;12. Either/or properties as adjectives</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '15/epv' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Emit Property Values</b></li></ul><p class="purpose">To feed the hierarchy of instances and their property values into Inter.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Emit Property Values</b></li></ul><p class="purpose">To feed the hierarchy of instances and their property values into Inter.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Emitting the property values</a></li><li><a href="#SP3">&#167;3. Attribute allocation</a></li><li><a href="#SP4">&#167;4. Rapid run-time testing</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '15/ia' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Indefinite Appearance</b></li></ul><p class="purpose">To look after the indefinite appearance pseudo-property, used when the source text comments on something with a sentence consisting only of a double-quoted literal text.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Indefinite Appearance</b></li></ul><p class="purpose">To look after the indefinite appearance pseudo-property, used when the source text comments on something with a sentence consisting only of a double-quoted literal text.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Inference</a></li><li><a href="#SP2">&#167;2. Reallocation</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '15/ma' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Measurement Adjectives</b></li></ul><p class="purpose">To define adjectives such as large, wide or roomy, which make implicit comparisons of the size of some numerical property, and which (unlike other adjectives) lead to comparative and superlative forms.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Measurement Adjectives</b></li></ul><p class="purpose">To define adjectives such as large, wide or roomy, which make implicit comparisons of the size of some numerical property, and which (unlike other adjectives) lead to comparative and superlative forms.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP5">&#167;5. Measurements</a></li><li><a href="#SP10">&#167;10. Adjectives arising from measurements</a></li><li><a href="#SP13">&#167;13. Support routines for measurement</a></li><li><a href="#SP14">&#167;14. Comparative forms</a></li><li><a href="#SP15">&#167;15. Late registration of prepositions comparing properties</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '15/pov' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Properties of Values</b></li></ul><p class="purpose">Two unrelated but minor support needs for properties of values which are not objects.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Properties of Values</b></li></ul><p class="purpose">Two unrelated but minor support needs for properties of values which are not objects.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. In-table storage</a></li><li><a href="#SP4">&#167;4. Avoiding a hacky I6 problem</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '15/pr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Properties</b></li></ul><p class="purpose">Elements of the model world, such as objects, have properties associated with them. Here we look after the identities of these different properties.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Properties</b></li></ul><p class="purpose">Elements of the model world, such as objects, have properties associated with them. Here we look after the identities of these different properties.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP4">&#167;4. Creation</a></li><li><a href="#SP6">&#167;6. As kinds</a></li><li><a href="#SP8">&#167;8. Parsing property names</a></li><li><a href="#SP14">&#167;14. Permissions</a></li><li><a href="#SP15">&#167;15. Logging</a></li><li><a href="#SP16">&#167;16. Access to details</a></li><li><a href="#SP21">&#167;21. Translated names of properties</a></li><li><a href="#SP23">&#167;23. Traversing properties</a></li><li><a href="#SP25">&#167;25. Compiling property values</a></li><li><a href="#SP27">&#167;27. Emitting to Inter</a></li></ul><hr class="tocbar">

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '15/spr' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Same Property Relation</b></li></ul><p class="purpose">Each value property has an associated relation to compare its value between two holders.</p>
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Same Property Relation</b></li></ul><p class="purpose">Each value property has an associated relation to compare its value between two holders.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Initial stock</a></li><li><a href="#SP2">&#167;2. Second stock</a></li><li><a href="#SP3">&#167;3. Typechecking</a></li><li><a href="#SP4">&#167;4. Assertion</a></li><li><a href="#SP5">&#167;5. Compilation</a></li><li><a href="#SP7">&#167;7. Problem message text</a></li></ul><hr class="tocbar">

Some files were not shown because too many files have changed in this diff Show more