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:
parent
c49ce42a2e
commit
a693ee4653
14
README.md
14
README.md
|
@ -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):
|
||||
|
|
|
@ -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">★</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">§1. Block Format</a></li><li><a href="#SP2">§2. KOV Support</a></li><li><a href="#SP3">§3. Creation</a></li><li><a href="#SP4">§4. Destruction</a></li><li><a href="#SP5">§5. Copying</a></li><li><a href="#SP6">§6. Comparison</a></li><li><a href="#SP7">§7. Hashing</a></li><li><a href="#SP8">§8. Printing</a></li><li><a href="#SP9">§9. List From Description</a></li><li><a href="#SP10">§10. Find Item</a></li><li><a href="#SP11">§11. Insert Item</a></li><li><a href="#SP12">§12. Append List</a></li><li><a href="#SP13">§13. Remove Value</a></li><li><a href="#SP14">§14. Remove Item Range</a></li><li><a href="#SP15">§15. Remove List</a></li><li><a href="#SP16">§16. Get Length</a></li><li><a href="#SP17">§17. Set Length</a></li><li><a href="#SP18">§18. Get Item</a></li><li><a href="#SP19">§19. Write Item</a></li><li><a href="#SP20">§20. Put Item</a></li><li><a href="#SP21">§21. Reversing</a></li><li><a href="#SP22">§22. Rotation</a></li><li><a href="#SP23">§23. Sorting</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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>§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>§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>§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"><</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>§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"><</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>§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"><</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"><</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>§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"><</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>§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"><</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">) && (</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"><</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"> & </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>§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 —
|
||||
say, "lighted rooms adjacent to the Transport Hub" — 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"> > </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"><</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>§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"><</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"><</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>§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"> && (</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">) && ((</span><span class="identifier">posn</span><span class="plain"><1) || (</span><span class="identifier">posn</span><span class="plain"> > </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 > </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">></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>§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">) && ((</span><span class="identifier">posn</span><span class="plain"><1) || (</span><span class="identifier">posn</span><span class="plain"> > </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"> > </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">>=</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"><</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"><</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>§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"><</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"><</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>§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"> > </span><span class="reserved">to</span><span class="plain">) || (</span><span class="identifier">from</span><span class="plain"> <= </span><span class="constant">0</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">forgive</span><span class="plain">) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain"> <= </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"> >= </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"> > </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"><</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"><</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>§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"><</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"><</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"><</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>§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>§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 —
|
||||
padding a list of numbers with 0s, a list of texts with copies of the
|
||||
empty text, and so on — 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"> < </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"> < </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"> > </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"><</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"> > </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"><</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"><</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"><</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>§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"><=0) || (</span><span class="identifier">i</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">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"> >= </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>§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"><=0) || (</span><span class="identifier">i</span><span class="plain">></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>§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"><=0) || (</span><span class="identifier">i</span><span class="plain">></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>§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"> < </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<</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>§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"> < </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"><</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">>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>§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"> < </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"><</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"> > </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"> < </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>
|
||||
|
|
@ -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">§1. Introduction</a></li><li><a href="#SP3">§3. The beginning</a></li><li><a href="#SP4">§4. The end</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Architectures</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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>§1. </b></p>
|
||||
|
||||
|
|
|
@ -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">§1. Architectures</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Standard adoption</a></li><li><a href="#SP5">§5. Printing and parsing</a></li><li><a href="#SP8">§8. Precendence</a></li><li><a href="#SP11">§11. Trichotomy</a></li><li><a href="#SP13">§13. Ranges</a></li><li><a href="#SP22">§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">§21</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP21"></a><b>§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
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">§1. Introduction</a></li><li><a href="#SP2">§2. Setting up the memory manager</a></li><li><a href="#SP4">§4. The beginning</a></li><li><a href="#SP5">§5. The end</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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>§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>§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>
|
||||
|
|
|
@ -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>§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>§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>
|
||||
|
|
|
@ -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">§1. Families</a></li><li><a href="#SP2">§2. Printing inames</a></li><li><a href="#SP4">§4. Making new inames</a></li><li><a href="#SP8">§8. Conversion of inames to symbols</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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>§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>§1. </b></p>
|
||||
|
||||
|
||||
<pre class="display">
|
||||
|
|
|
@ -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">§1. Package requests</a></li><li><a href="#SP10">§10. Bubbles</a></li><li><a href="#SP11">§11. Outside the packages</a></li><li><a href="#SP12">§12. Entry and exit</a></li><li><a href="#SP13">§13. Incarnation</a></li><li><a href="#SP14">§14. Compilation modules</a></li><li><a href="#SP15">§15. Modules</a></li><li><a href="#SP16">§16. Submodules</a></li><li><a href="#SP19">§19. Functions</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Package types</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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>§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.
|
||||
|
|
|
@ -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>§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>§1. </b></p>
|
||||
|
||||
|
||||
<pre class="definitions">
|
||||
|
|
|
@ -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>§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>§1. Compilation. </b></p>
|
||||
|
||||
|
||||
<pre class="display">
|
||||
|
|
|
@ -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>§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>§1. Definition. </b>An inter schema is a set of instructions for compiling inter code, while
|
||||
interspersing certain values at given places.
|
||||
</p>
|
||||
|
||||
|
|
|
@ -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>§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>§1. Definitions. </b></p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
||||
|
||||
|
|
|
@ -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">§3. Conversions</a></li><li><a href="#SP4">§4. Holstering data</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">§1. Current architecture</a></li><li><a href="#SP2">§2. Prepare stage</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Introduction</a></li><li><a href="#SP2">§2. Setting up the memory manager</a></li><li><a href="#SP4">§4. The beginning</a></li><li><a href="#SP5">§5. The end</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">★</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">§1. </a></li><li><a href="#SP2">§2. Link stage</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">>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">>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">>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">>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">>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"><</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>§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">>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">>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">>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">>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">>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">§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>
|
||||
|
|
@ -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">§1. </a></li><li><a href="#SP2">§2. Link stage</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Steps</a></li><li><a href="#SP4">§4. Pipelines</a></li><li><a href="#SP5">§5. Following</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Stages</a></li><li><a href="#SP2">§2. Creation</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Pipeline stage</a></li><li><a href="#SP2">§2. Parsing</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Pipeline stage</a></li><li><a href="#SP1_1">§1.1. Peephole optimisation</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Pipeline stage</a></li><li><a href="#SP2">§2. Preservation</a></li><li><a href="#SP4">§4. Destruction</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Pipeline stage</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Interventions</a></li><li><a href="#SP5">§5. I6T kits</a></li><li><a href="#SP8">§8. Syntax of I6T files</a></li><li><a href="#SP10_2_4_3">§10.2.4.3. Acting on I6T commands</a></li><li><a href="#SP11">§11. Contents section</a></li><li><a href="#SP12">§12. Template errors</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Link</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Pipeline stage</a></li><li><a href="#SP2">§2. Parsing</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Pipeline stage</a></li><li><a href="#SP2">§2. Resolution</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Pipeline stage</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Pipeline stage</a></li><li><a href="#SP2">§2. Parsing</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Pipeline stage</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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>§1. </b></p>
|
||||
|
||||
|
|
|
@ -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">§1. Pipeline stage</a></li><li><a href="#SP2">§2. Generations</a></li><li><a href="#SP8">§8. </a></li><li><a href="#SP10">§10. Marking</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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>§1. </b></p>
|
||||
|
||||
|
|
|
@ -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">§2. Representing instances in I6</a></li><li><a href="#SP3">§3. Representing properties in I6</a></li><li><a href="#SP4">§4. Properties</a></li><li><a href="#SP5_7">§5.7. The kind inheritance tree</a></li><li><a href="#SP5_8">§5.8. Lookup mechanism for properties of value instances</a></li><li><a href="#SP6">§6. Instances</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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>§1. </b></p>
|
||||
|
||||
|
|
|
@ -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>§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
|
||||
|
|
|
@ -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>§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
|
||||
|
|
|
@ -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">§1. Targets</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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>§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
|
||||
|
|
|
@ -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">§1. Target</a></li><li><a href="#SP2">§2. Segmentation</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">§2. Setting up the memory manager</a></li><li><a href="#SP5">§5. The beginning</a></li><li><a href="#SP8">§8. The end</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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>§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
|
||||
|
|
|
@ -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">★</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">§1. Kits</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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"><</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">>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">>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">>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">>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">>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">>priority</span><span class="plain"> = 10;</span>
|
||||
<span class="identifier">K</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">(&</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">(&</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">>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">(&</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">>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">(&</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">>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">(&</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">>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">(&</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">>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">>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">(&</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">>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">(&</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">>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">(&</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">>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">(&</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">(&</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">(&</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">(&</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">(&</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">>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">(&</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">>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">>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">>then_name</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &&</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">>if_name</span><span class="plain">) == </span><span class="identifier">ITTT</span><span class="plain">-</span><span class="element">>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">>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"><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">>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">>name</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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"> >= 0) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">EA</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">§6</a>), 3/nl (<a href="3-nl.html#SP18">§18</a>).</p>
|
||||
|
||||
<p class="endnote">The function Kits::determine is used in 1/mr (<a href="1-mr.html#SP4_8">§4.8</a>).</p>
|
||||
|
||||
<p class="endnote">The function Kits::load_types is used in 1/mr (<a href="1-mr.html#SP4_10">§4.10</a>).</p>
|
||||
|
||||
<p class="endnote">The function Kits::activate_plugins is used in 1/mr (<a href="1-mr.html#SP4_10">§4.10</a>).</p>
|
||||
|
||||
<p class="endnote">The function Kits::Main_defined is used in 1/mr (<a href="1-mr.html#SP4_15">§4.15</a>).</p>
|
||||
|
||||
<p class="endnote">The function Kits::index_template is used in 1/mr (<a href="1-mr.html#SP4_17">§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>§2. </b>In particular, every source text read into Inform is automatically prefixed by
|
||||
the following eight words — 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">>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">>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">>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">>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">>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">>location</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">-</span><span class="element">>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">§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">§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>
|
||||
|
|
@ -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">§1. The Management</a></li><li><a href="#SP2">§2. Command line processing</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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>§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
|
||||
|
|
|
@ -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">★</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">§1. Definitions</a></li><li><a href="#SP5">§5. Command line settings</a></li><li><a href="#SP6">§6. Establishing the defaults</a></li><li><a href="#SP6_1">§6.1. Internal resources</a></li><li><a href="#SP6_2">§6.2. External resources</a></li><li><a href="#SP6_3">§6.3. Project resources</a></li><li><a href="#SP6_4">§6.4. Materials resources</a></li><li><a href="#SP7">§7. EILTs</a></li><li><a href="#SP8">§8. Location of extensions</a></li><li><a href="#SP10">§10. Location of index files</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2"></a><b>§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>§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>§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>§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">§6</a>).</p>
|
||||
|
||||
<p class="endnote">The function Locations::set_internal is used in 1/mr (<a href="1-mr.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="endnote">The function Locations::set_default_internal is used in 1/mr (<a href="1-mr.html#SP4_4">§4.4</a>).</p>
|
||||
|
||||
<p class="endnote">The function Locations::set_external is used in 1/mr (<a href="1-mr.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="endnote">The function Locations::set_transient is used in 1/mr (<a href="1-mr.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="endnote">The function Locations::set_I7_source is used in 1/mr (<a href="1-mr.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="endnote">The function Locations::set_SR_module appears nowhere else.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6"></a><b>§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>
|
||||
<<span class="cwebmacro">Internal resources</span> <span class="cwebmacronumber">6.1</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">External resources</span> <span class="cwebmacronumber">6.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Project resources</span> <span class="cwebmacronumber">6.3</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Materials resources</span> <span class="cwebmacronumber">6.4</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">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">) && (</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">§4.5</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_1"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Internal resources</span> <span class="cwebmacronumber">6.1</span>> =
|
||||
</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>
|
||||
|
||||
<<span class="cwebmacro">Miscellaneous other stuff</span> <span class="cwebmacronumber">6.1.1</span>><span class="plain">;</span>
|
||||
</pre>
|
||||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_1_1"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Miscellaneous other stuff</span> <span class="cwebmacronumber">6.1.1</span>> =
|
||||
</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">§6.1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_2"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">External resources</span> <span class="cwebmacronumber">6.2</span>> =
|
||||
</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>
|
||||
<<span class="cwebmacro">Permanent external resources</span> <span class="cwebmacronumber">6.2.1</span>><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>
|
||||
<<span class="cwebmacro">Transient external resources</span> <span class="cwebmacronumber">6.2.2</span>><span class="plain">;</span>
|
||||
</pre>
|
||||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_2_1"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Permanent external resources</span> <span class="cwebmacronumber">6.2.1</span>> =
|
||||
</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">§6.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_2_2"></a><b>§6.2.2. </b>The transient resources are all written by us.
|
||||
</p>
|
||||
|
||||
|
||||
<p class="macrodefinition"><code class="display">
|
||||
<<span class="cwebmacrodefn">Transient external resources</span> <span class="cwebmacronumber">6.2.2</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
<pre class="displaydefn">
|
||||
<<span class="cwebmacro">Transient documentation</span> <span class="cwebmacronumber">6.2.2.1</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Transient telemetry</span> <span class="cwebmacronumber">6.2.2.2</span>><span class="plain">;</span>
|
||||
</pre>
|
||||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP6_2">§6.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_2_2_1"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Transient documentation</span> <span class="cwebmacronumber">6.2.2.1</span>> =
|
||||
</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">§6.2.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_2_2_2"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Transient telemetry</span> <span class="cwebmacronumber">6.2.2.2</span>> =
|
||||
</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">-></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">-></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">-></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">§6.2.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_3"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Project resources</span> <span class="cwebmacronumber">6.3</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
<pre class="displaydefn">
|
||||
<<span class="cwebmacro">The Source folder within the project</span> <span class="cwebmacronumber">6.3.1</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">The Build folder within the project</span> <span class="cwebmacronumber">6.3.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">The Index folder within the project</span> <span class="cwebmacronumber">6.3.3</span>><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">§6</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_3_1"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">The Source folder within the project</span> <span class="cwebmacronumber">6.3.1</span>> =
|
||||
</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">§6.3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_3_2"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">The Build folder within the project</span> <span class="cwebmacronumber">6.3.2</span>> =
|
||||
</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">§6.3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_3_3"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">The Index folder within the project</span> <span class="cwebmacronumber">6.3.3</span>> =
|
||||
</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">§6.3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_4"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Materials resources</span> <span class="cwebmacronumber">6.4</span>> =
|
||||
</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">>0) && (</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">>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">-></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>
|
||||
|
||||
<<span class="cwebmacro">Figures and sounds</span> <span class="cwebmacronumber">6.4.1</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">The Release folder</span> <span class="cwebmacronumber">6.4.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Existing story file</span> <span class="cwebmacronumber">6.4.3</span>><span class="plain">;</span>
|
||||
</pre>
|
||||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_4_1"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Figures and sounds</span> <span class="cwebmacronumber">6.4.1</span>> =
|
||||
</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">§6.4</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_4_2"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">The Release folder</span> <span class="cwebmacronumber">6.4.2</span>> =
|
||||
</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">§6.4</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_4_3"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Existing story file</span> <span class="cwebmacronumber">6.4.3</span>> =
|
||||
</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">§6.4</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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">§6.1</a>, <a href="#SP6_2_1">§6.2.1</a>, <a href="#SP6_4">§6.4</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP8"></a><b>§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">§6.1</a>), 8/ec (<a href="8-ec.html#SP5_2_2_1">§5.2.2.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP9"></a><b>§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">§3</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP10"></a><b>§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"> >= 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>
|
||||
|
|
@ -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">§1. Task data</a></li><li><a href="#SP9">§9. Project-related files and file paths</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Introduction</a></li><li><a href="#SP3">§3. Top-level nonterminals</a></li><li><a href="#SP11">§11. The cache</a></li><li><a href="#SP15">§15. Void phrases</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Constant values</a></li><li><a href="#SP8">§8. Adjective lists</a></li><li><a href="#SP19">§19. Descriptions</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Conditions</a></li><li><a href="#SP9">§9. Command phrases</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Literals in the S-grammar</a></li><li><a href="#SP2">§2. Response letters</a></li><li><a href="#SP3">§3. Truth states</a></li><li><a href="#SP5">§5. Real numbers</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP3">§3. Type expressions</a></li><li><a href="#SP10">§10. Values</a></li><li><a href="#SP14">§14. Variables</a></li><li><a href="#SP21">§21. Table references</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP3">§3. The top level of the S-grammar</a></li><li><a href="#SP9">§9. Tidying up a sentence subtree</a></li><li><a href="#SP10">§10. Values as noun phrases</a></li><li><a href="#SP13">§13. Junction</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP5">§5. The elements</a></li><li><a href="#SP7">§7. Creating atoms</a></li><li><a href="#SP8">§8. The STRUCTURAL group</a></li><li><a href="#SP11">§11. The PREDICATES group</a></li><li><a href="#SP24">§24. Validating atoms</a></li><li><a href="#SP25">§25. Debugging log</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP4">§4. Well-formedness</a></li><li><a href="#SP9">§9. Renumbering</a></li><li><a href="#SP12">§12. Binding</a></li><li><a href="#SP13">§13. Substitution</a></li><li><a href="#SP16">§16. A footnote on variable 0</a></li><li><a href="#SP19">§19. Detect locals</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§2. Why predicate calculus</a></li><li><a href="#SP4">§4. Formal description</a></li><li><a href="#SP7">§7. Free and bound variables, well-formedness</a></li><li><a href="#SP8">§8. The scope of quantifiers</a></li><li><a href="#SP10">§10. What is not in our calculus</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP7">§7. Implied conjunction</a></li><li><a href="#SP10">§10. Validity</a></li><li><a href="#SP13">§13. Complexity</a></li><li><a href="#SP14">§14. Primitive operations on propositions</a></li><li><a href="#SP17">§17. Inserting and deleting atoms</a></li><li><a href="#SP19">§19. Inspecting contents</a></li><li><a href="#SP20">§20. Matching sequences of atoms</a></li><li><a href="#SP21">§21. Seeking atoms</a></li><li><a href="#SP29">§29. Bracketed groups</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. The meaning of a sentence</a></li><li><a href="#SP1_14">§1.14. Simplification</a></li><li><a href="#SP3">§3. The meaning of a noun phrase</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP3">§3. Simplify the nothing constant (fudge)</a></li><li><a href="#SP4">§4. Use listed-in predicates (deduction)</a></li><li><a href="#SP5">§5. Simplify negated determiners (deduction)</a></li><li><a href="#SP7">§7. Simplify negated satisfiability (deduction)</a></li><li><a href="#SP8">§8. Make kind requirements explicit (deduction)</a></li><li><a href="#SP9">§9. Remove redundant kind predicates (deduction)</a></li><li><a href="#SP11">§11. Turn binary predicates the right way round (deduction)</a></li><li><a href="#SP12">§12. Simplify region containment (fudge)</a></li><li><a href="#SP13">§13. Reduce binary predicates (deduction)</a></li><li><a href="#SP14">§14. Eliminating determined variables (deduction)</a></li><li><a href="#SP15">§15. Simplify non-relation (deduction)</a></li><li><a href="#SP16">§16. Convert gerunds to nouns (deduction)</a></li><li><a href="#SP17">§17. Eliminate to have meaning property ownership (fudge)</a></li><li><a href="#SP19">§19. Turn all rooms to everywhere (fudge)</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Elementary propositions</a></li><li><a href="#SP6">§6. Property setting</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP4">§4. Problem reporting kit</a></li><li><a href="#SP6">§6. Type-checking whole propositions</a></li><li><a href="#SP6_1">§6.1. Finding kinds for variables</a></li><li><a href="#SP6_5">§6.5. Type-checking enforced on predicate-like atoms</a></li><li><a href="#SP7">§7. The kind of a term</a></li><li><a href="#SP10">§10. Type-checking predicates</a></li><li><a href="#SP12">§12. Two problem messages needed more than once</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP4">§4. Creating new terms</a></li><li><a href="#SP5">§5. Copying</a></li><li><a href="#SP6">§6. Variable letters</a></li><li><a href="#SP7">§7. Underlying terms</a></li><li><a href="#SP8">§8. Adjective-noun conversions</a></li><li><a href="#SP10">§10. Compiling terms</a></li><li><a href="#SP11">§11. Debugging terms</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP5">§5. Entrance</a></li><li><a href="#SP9">§9. Main procedure</a></li><li><a href="#SP9_5">§9.5. Creations</a></li><li><a href="#SP9_6">§9.6. Asserting kinds</a></li><li><a href="#SP9_7">§9.7. Asserting HERE, NOWHERE and EVERYWHERE</a></li><li><a href="#SP9_10">§9.10. Asserting predicates</a></li><li><a href="#SP11">§11. Evaluating terms</a></li><li><a href="#SP13">§13. Testing at compile-time</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP5_1">§5.1. Stage 1</a></li><li><a href="#SP5_2">§5.2. Stage 2</a></li><li><a href="#SP6">§6. Constructing the schema</a></li><li><a href="#SP8">§8. An unannotated one</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. About cinders</a></li><li><a href="#SP3">§3. Finding cinders</a></li><li><a href="#SP5">§5. Declaring cinder parameters</a></li><li><a href="#SP6">§6. The kind of terms</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Comment</a></li><li><a href="#SP2">§2. Preliminaries</a></li><li><a href="#SP2_1_6_1_1">§2.1.6.1.1. The Search</a></li><li><a href="#SP2_1_6_1_2_1">§2.1.6.1.2.1. The R-stack</a></li><li><a href="#SP2_1_6_1_2_3">§2.1.6.1.2.3. Compiling the search</a></li><li><a href="#SP2_1_6_1_2_3_1">§2.1.6.1.2.3.1. Predicate runs and their negations</a></li><li><a href="#SP2_1_6_1_2_3_5">§2.1.6.1.2.3.5. Quantifiers and the Q-stack</a></li><li><a href="#SP2_1_6_1_2_3_8">§2.1.6.1.2.3.8. The C-stack</a></li><li><a href="#SP2_1_5_1">§2.1.5.1. Adaptations</a></li><li><a href="#SP2_1_6_1_3">§2.1.6.1.3. Adaptation to CONDITION</a></li><li><a href="#SP2_1_6_1_5">§2.1.6.1.5. Adaptation to NUMBER</a></li><li><a href="#SP2_1_6_1_8">§2.1.6.1.8. Adaptation to LIST</a></li><li><a href="#SP2_1_6_1_10">§2.1.6.1.10. Adaptation to RANDOM</a></li><li><a href="#SP2_1_6_1_12">§2.1.6.1.12. Adaptation to TOTAL</a></li><li><a href="#SP2_1_6_1_14">§2.1.6.1.14. Adaptation to EXTREMAL</a></li><li><a href="#SP2_1_6_1_16">§2.1.6.1.16. Adaptation to LOOP</a></li><li><a href="#SP3">§3. Compiling loop headers</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP3">§3. The guillotine</a></li><li><a href="#SP4">§4. Deferral requests</a></li><li><a href="#SP7">§7. Testing, or deferring a test</a></li><li><a href="#SP11">§11. Forcing with now, or deferring the force</a></li><li><a href="#SP12">§12. Multipurpose descriptions</a></li><li><a href="#SP23">§23. Domains of loops</a></li><li><a href="#SP28">§28. Checking the validity of a description</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP4">§4. Building schemas</a></li><li><a href="#SP5">§5. Emptiness</a></li><li><a href="#SP6">§6. Expansion</a></li><li><a href="#SP10">§10. Logging schemas</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP3">§3. Initial stock</a></li><li><a href="#SP4">§4. Second stock</a></li><li><a href="#SP5">§5. Typechecking</a></li><li><a href="#SP6">§6. Assertion</a></li><li><a href="#SP7">§7. Compilation</a></li><li><a href="#SP8">§8. Problem message text</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP3">§3. Initial stock</a></li><li><a href="#SP4">§4. Second stock</a></li><li><a href="#SP5">§5. Typechecking</a></li><li><a href="#SP7">§7. Assertion</a></li><li><a href="#SP8">§8. Compilation</a></li><li><a href="#SP9">§9. Problem message text</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Compiling arithmetic</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. </a></li><li><a href="#SP7">§7. Problems with kinds</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Indexing the kinds</a></li><li><a href="#SP2">§2. Kind table construction</a></li><li><a href="#SP6">§6. Indexing kind names</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP3">§3. Kinds as I6 classes</a></li><li><a href="#SP4">§4. Default values</a></li><li><a href="#SP6">§6. Equality tests</a></li><li><a href="#SP7">§7. Casts at runtime</a></li><li><a href="#SP8">§8. IDs</a></li><li><a href="#SP17">§17. The heap</a></li><li><a href="#SP21">§21. Run-time support for units and enumerations</a></li><li><a href="#SP24_6">§24.6. Further runtime support</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Creation</a></li><li><a href="#SP12">§12. Pretty-printing</a></li><li><a href="#SP14">§14. Specificity</a></li><li><a href="#SP16">§16. Compiling</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Descriptions vs propositions</a></li><li><a href="#SP3">§3. Descriptions vs kinds</a></li><li><a href="#SP5">§5. Descriptions vs instances</a></li><li><a href="#SP6">§6. Descriptions vs constants</a></li><li><a href="#SP7">§7. Testing</a></li><li><a href="#SP8">§8. Adjectives</a></li><li><a href="#SP9">§9. Quantification</a></li><li><a href="#SP10">§10. Callings</a></li><li><a href="#SP11">§11. Pretty-printing</a></li><li><a href="#SP12">§12. Comparing</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP4">§4. The Dashboard</a></li><li><a href="#SP8">§8. Return values</a></li><li><a href="#SP9">§9. (1) Entering Dash</a></li><li><a href="#SP10">§10. (2) Recursion point</a></li><li><a href="#SP11">§11. (3) Context switching</a></li><li><a href="#SP11_8">§11.8. New variables</a></li><li><a href="#SP11_9">§11.9. (4) Typechecking within current context</a></li><li><a href="#SP11_9_1_2">§11.9.1.2. (4S) Verifying single non-invocation readings</a></li><li><a href="#SP13">§13. Arithmetic operands</a></li><li><a href="#SP14">§14. Local variable markers</a></li><li><a href="#SP15">§15. Problems, problems, problems</a></li><li><a href="#SP19">§19. (5) Single nodes</a></li><li><a href="#SP19_2">§19.2. Rule (5.a)</a></li><li><a href="#SP19_3">§19.3. Rule (5.b)</a></li><li><a href="#SP19_4">§19.4. Rule (5.c)</a></li><li><a href="#SP19_5">§19.5. Rule (5.d)</a></li><li><a href="#SP19_6">§19.6. Rule (5.e)</a></li><li><a href="#SP22">§22. Ambiguity testing flags</a></li><li><a href="#SP27">§27. Value checking</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Creation</a></li><li><a href="#SP7">§7. Testing</a></li><li><a href="#SP10">§10. Pretty-printing</a></li><li><a href="#SP12">§12. Compilation</a></li><li><a href="#SP14">§14. Rvalue compilation</a></li><li><a href="#SP15">§15. Lvalue compilation</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Constants</a></li><li><a href="#SP7">§7. Literals as rvalues</a></li><li><a href="#SP17">§17. Pairs</a></li><li><a href="#SP18">§18. Constant descriptions</a></li><li><a href="#SP19">§19. Testing</a></li><li><a href="#SP21">§21. Pretty-printing</a></li><li><a href="#SP23">§23. Compilation</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Kinds vs specifications</a></li><li><a href="#SP6">§6. Pretty-printing specifications</a></li><li><a href="#SP7">§7. Sorting</a></li><li><a href="#SP8">§8. The Unknown</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§5. Coincidence</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP3">§3. Initial stock</a></li><li><a href="#SP4">§4. Second stock</a></li><li><a href="#SP5">§5. Typechecking</a></li><li><a href="#SP6">§6. Assertion</a></li><li><a href="#SP7">§7. Compilation</a></li><li><a href="#SP8">§8. Problem message text</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. A design choice</a></li><li><a href="#SP3">§3. Requesting new named properties</a></li><li><a href="#SP4">§4. Requesting new nameless properties</a></li><li><a href="#SP5">§5. Initialising details</a></li><li><a href="#SP9">§9. Assertion</a></li><li><a href="#SP10">§10. Compilation</a></li><li><a href="#SP12">§12. Either/or properties as adjectives</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Emitting the property values</a></li><li><a href="#SP3">§3. Attribute allocation</a></li><li><a href="#SP4">§4. Rapid run-time testing</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Inference</a></li><li><a href="#SP2">§2. Reallocation</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP5">§5. Measurements</a></li><li><a href="#SP10">§10. Adjectives arising from measurements</a></li><li><a href="#SP13">§13. Support routines for measurement</a></li><li><a href="#SP14">§14. Comparative forms</a></li><li><a href="#SP15">§15. Late registration of prepositions comparing properties</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. In-table storage</a></li><li><a href="#SP4">§4. Avoiding a hacky I6 problem</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Definitions</a></li><li><a href="#SP4">§4. Creation</a></li><li><a href="#SP6">§6. As kinds</a></li><li><a href="#SP8">§8. Parsing property names</a></li><li><a href="#SP14">§14. Permissions</a></li><li><a href="#SP15">§15. Logging</a></li><li><a href="#SP16">§16. Access to details</a></li><li><a href="#SP21">§21. Translated names of properties</a></li><li><a href="#SP23">§23. Traversing properties</a></li><li><a href="#SP25">§25. Compiling property values</a></li><li><a href="#SP27">§27. Emitting to Inter</a></li></ul><hr class="tocbar">
|
||||
|
||||
|
|
|
@ -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">§1. Initial stock</a></li><li><a href="#SP2">§2. Second stock</a></li><li><a href="#SP3">§3. Typechecking</a></li><li><a href="#SP4">§4. Assertion</a></li><li><a href="#SP5">§5. Compilation</a></li><li><a href="#SP7">§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
Loading…
Reference in a new issue