mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
873 lines
143 KiB
HTML
873 lines
143 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Lists Template</title>
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<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>
|
|
<nav role="navigation">
|
|
<h1><a href="../index.html">
|
|
<img src="../docs-src/Figures/Inform.png" height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul><h2>Extensions</h2><ul>
|
|
<li><a href="../basic_inform/index.html">basic_inform</a></li>
|
|
<li><a href="../standard_rules/index.html">standard_rules</a></li>
|
|
</ul><h2>Kits</h2><ul>
|
|
<li><a href="index.html"><span class="selectedlink">BasicInformKit</span></a></li>
|
|
<li><a href="../BasicInformExtrasKit/index.html">BasicInformExtrasKit</a></li>
|
|
<li><a href="../CommandParserKit/index.html">CommandParserKit</a></li>
|
|
<li><a href="../EnglishLanguageKit/index.html">EnglishLanguageKit</a></li>
|
|
<li><a href="../WorldModelKit/index.html">WorldModelKit</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'Lists Template' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</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="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 Inform'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="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="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="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 {\it 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"> = -1;</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 Inform'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"> == -1) </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"> == -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">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">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"> -1;</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-rgx.html">Back to 'RegExp Template'</a></li><li><a href="S-cmb.html">Continue with 'Combinations Template'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
<script>
|
|
MathJax = {
|
|
tex: {
|
|
inlineMath: '$', '$'], ['\\(', '\\)'
|
|
},
|
|
svg: {
|
|
fontCache: 'global'
|
|
}
|
|
};
|
|
</script>
|
|
<script type="text/javascript" id="MathJax-script" async
|
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
|
|
</script>
|
|
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|