mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
1215 lines
185 KiB
HTML
1215 lines
185 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>S/lt</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="../webs.html">Sources</a></h1>
|
|
<ul>
|
|
<li><a href="../compiler.html">compiler</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html"><b>extensions and kits</b></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="../BasicInformKit/index.html">BasicInformKit</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 'S/lt2' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">WorldModelKit</a></li><li><b>ListWriter Template</b></li></ul><p class="purpose">A flexible object-lister taking care of plurals, inventory information, various formats and so on.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Specification</a></li><li><a href="#SP2">§2. Memory</a></li><li><a href="#SP3">§3. WriteListOfMarkedObjects</a></li><li><a href="#SP4">§4. List Number and Gender</a></li><li><a href="#SP5">§5. List Writer Regard Storage</a></li><li><a href="#SP6">§6. Response Printing</a></li><li><a href="#SP7">§7. About Iterator Functions</a></li><li><a href="#SP8">§8. Marked List Iterator</a></li><li><a href="#SP9">§9. Concealment</a></li><li><a href="#SP10">§10. Coalesce Marked List</a></li><li><a href="#SP11">§11. Object Tree Iterator</a></li><li><a href="#SP12">§12. Coalesce Object Tree</a></li><li><a href="#SP13">§13. GroupChildren</a></li><li><a href="#SP14">§14. WriteListFrom</a></li><li><a href="#SP15">§15. Standard Contents Listing Rule</a></li><li><a href="#SP16">§16. Partitioning</a></li><li><a href="#SP17">§17. Partition List</a></li><li><a href="#SP18">§18. Equivalence Relation</a></li><li><a href="#SP19">§19. Grouping</a></li><li><a href="#SP20">§20. Write List Recursively</a></li><li><a href="#SP21">§21. Write Multiple Class Group</a></li><li><a href="#SP22">§22. Write Single Class Group</a></li><li><a href="#SP23">§23. Write After Entry</a></li><li><a href="#SP24">§24. Internal Rule</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Specification. </b>The list-writer is called by one of the following function calls:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(1) <code class="display"><span class="extract">WriteListOfMarkedObjects(style)</span></code>, where the set of objects listed is
|
|
understood to be exactly those with the <code class="display"><span class="extract">workflag2</span></code> attribute set, and
|
|
<ul class="items"><li>(a) the <code class="display"><span class="extract">style</span></code> is a sum of <code class="display"><span class="extract">*_BIT</span></code> constants as defined in "Definitions.i6t".
|
|
</li></ul>
|
|
</li></ul>
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(2) <code class="display"><span class="extract">WriteListFrom(obj, style, depth, noactivity, iterator)</span></code>, where only the
|
|
first two parameters are compulsory:
|
|
<ul class="items"><li>(a) the set of objects listed begins with <code class="display"><span class="extract">obj</span></code>;
|
|
</li><li>(b) the <code class="display"><span class="extract">style</span></code> is a sum of <code class="display"><span class="extract">*_BIT</span></code> constants as defined in "Definitions.i6t";
|
|
</li><li>(c) the <code class="display"><span class="extract">depth</span></code> is the recursion depth within the list — ordinarily 0, but
|
|
by supplying a higher value, we can simulate a sublist of another list;
|
|
</li><li>(d) <code class="display"><span class="extract">noactivity</span></code> is a flag which forces the list-writer to ignore the
|
|
"listing the contents of" activity (in cases where it would otherwise consult
|
|
this): by default this is <code class="display"><span class="extract">false</span></code>;
|
|
</li><li>(e) <code class="display"><span class="extract">iterator</span></code> is an iterator function which provides the objects in sequence.
|
|
</li></ul>
|
|
</li></ul>
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">WriteListOfMarkedObjects</span></code> is simply a front-end which supplies suitable
|
|
parameters for <code class="display"><span class="extract">WriteListFrom</span></code>.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The iterator function is by default <code class="display"><span class="extract">ObjectTreeIterator</span></code>. This defines the
|
|
sequence of objects as being the children of the parent of <code class="display"><span class="extract">obj</span></code>, in object
|
|
tree sequence (that is: <code class="display"><span class="extract">child(parent(obj))</span></code> is first). Moreover, when using
|
|
<code class="display"><span class="extract">ObjectTreeIterator</span></code>, the "listing the contents of" activity is carried out,
|
|
unless <code class="display"><span class="extract">noactivity</span></code> is set.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We also provide the iterator function <code class="display"><span class="extract">MarkedListIterator</span></code>, which defines
|
|
the sequence of objects as being the list in the word array
|
|
<code class="display"><span class="extract">MarkedObjectArray</span></code> with length <code class="display"><span class="extract">MarkedObjectLength</span></code>. Here the "listing
|
|
the contents of" activity is never used, since the objects are not
|
|
necessarily the contents of any single thing. This of course is the
|
|
iterator used by <code class="display"><span class="extract">WriteListOfMarkedObjects(style)</span></code>: it works by filling
|
|
this array with all the objects having <code class="display"><span class="extract">workflag2</span></code> set.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The full specification for iterator functions is given below.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The list-writer automatically groups adjacent and indistinguishable terms
|
|
in the sequence into plurals, and carries out the "printing the plural
|
|
name" activity to handle these. Doing this alone would result in text such
|
|
as "You can see a cake, three coins, an onion, and two coins here",
|
|
where the five coins are mentioned in two clauses because they happen not
|
|
to be adjacent in the list. The list-writer therefore carries out the activity
|
|
"grouping together" to see if the user would like to tie certain objects
|
|
together into a single entry: what this does is to set suitable <code class="display"><span class="extract">list_together</span></code>
|
|
properties for the objects. NI has already given plural objects a similar
|
|
<code class="display"><span class="extract">list_together</span></code> property. The net effect is that any entries in the list with
|
|
a non-blank value of <code class="display"><span class="extract">list_together</span></code> must be adjacent to each other.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We could achieve that by sorting the list in order of <code class="display"><span class="extract">list_together</span></code> value,
|
|
but that would result in drastic movements, whereas we want to upset the
|
|
original ordering as little as possible. So instead we use a process called
|
|
coalescing the list. This is such that for every value L!= 0
|
|
of <code class="display"><span class="extract">list_together</span></code>, every entry with that value is moved back in the list
|
|
to follow the first entry with that value. Thus if the original order is
|
|
x_1, x_2, ..., x_N then x_j still precedes x_k in coalesced order
|
|
unless there exists i<j<k such that L(i) = L(k) != 0 and L(j)!= L(i).
|
|
This is as stable as it can be while achieving the "interval" property
|
|
that non-zero L values occur in contiguous runs.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We therefore obtain text such as "You can see a cake, five coins, the tiles
|
|
W, X, Y and Z from a Scrabble set, and an onion here." where the coins and
|
|
the Scrabble tiles have been coalesced together in the list.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">It's important to note that the default <code class="display"><span class="extract">ObjectTreeIterator</span></code> has the
|
|
side-effect of actually reordering the object tree: it rearranges the children
|
|
being listed so that they appear in the tree in coalesced order. The
|
|
<code class="display"><span class="extract">MarkedListIterator</span></code> used by <code class="display"><span class="extract">WriteListOfMarkedObjects</span></code> has the same
|
|
side-effect if the marked objects all happen to share a common parent.
|
|
It might seem odd for a list-writer to have side effects at all, but the
|
|
idea is that occasional coalescing improves the quality of play in many
|
|
small ways — for instance, the sequence of matches to TAKE ALL is tidier —
|
|
and that coalescing has a small speed cost, so we want to do it as little
|
|
as possible. (The latter was more of a consideration for I6: interpreters
|
|
are faster nowadays.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">This specification is somewhat stronger than that of the I6 library's
|
|
traditional list-writer, because
|
|
</p>
|
|
|
|
<ul class="items"><li>(i) it supports arbitrary lists of objects, not just children of specific
|
|
parents, while still allowing coalesced and grouped lists,
|
|
</li><li>(ii) it can be used recursively in all cases,
|
|
</li><li>(iii) it uses its own memory, rather than borrowing memory from the parser,
|
|
so that it can safely be used while the parser is working, and
|
|
</li><li>(iv) it manages this memory more flexibly and without silently failing by
|
|
buffer overruns on unexpectedly large lists.
|
|
</li></ul>
|
|
<p class="inwebparagraph">The I7 version of <code class="display"><span class="extract">WriteListFrom</span></code>, when using <code class="display"><span class="extract">ObjectTreeIterator</span></code>, differs
|
|
from the I6 version in that the object <code class="display"><span class="extract">o</span></code> is required to be the <code class="display"><span class="extract">child</span></code> of
|
|
its <code class="display"><span class="extract">parent</span></code>, that is, to be the eldest child. (So in effect it's a function
|
|
of parents, not children, but we retain the form for familiarity's sake.)
|
|
In practice this was invariably the way <code class="display"><span class="extract">WriteListFrom</span></code> was used even in
|
|
I6 days.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Finally, the <code class="display"><span class="extract">ISARE_BIT</span></code> is differently interpreted in I7: instead of printing
|
|
something like " are ducks and drakes", as it would have done in I6, the
|
|
initial space is now suppressed and we instead print "are ducks and drakes".
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Memory. </b>The list-writer needs to dynamically allocate temporary array space of a known
|
|
size, in such a way that the array is effectively on the local stack frame:
|
|
if only either the Z-machine or Glulx supported a stack in memory, this would
|
|
be no problem, but they do not and we must therefore use the following.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The size of the stack is such that it can support a list which includes every
|
|
object and recurses in turn to most other objects: in practice, this never
|
|
happens. It would be nice to allocate more just in case, but the Z-machine is
|
|
desperately short of array memory.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">REQUISITION_STACK_SIZE</span><span class="plain"> = </span><span class="constant">3</span><span class="plain">*</span><span class="identifier">ICOUNT_OBJECT</span><span class="plain">;</span>
|
|
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">requisition_stack</span><span class="plain"> </span><span class="constant">--</span><span class="plain">> </span><span class="identifier">REQUISITION_STACK_SIZE</span><span class="plain">;</span>
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">requisition_stack_pointer</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RequisitionStack</span><span class="plain"> </span><span class="identifier">len</span><span class="plain"> </span><span class="identifier">top</span><span class="plain"> </span><span class="identifier">addr</span><span class="plain">;</span>
|
|
<span class="identifier">top</span><span class="plain"> = </span><span class="identifier">requisition_stack_pointer</span><span class="plain"> + </span><span class="identifier">len</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">top</span><span class="plain"> > </span><span class="identifier">REQUISITION_STACK_SIZE</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">addr</span><span class="plain"> = </span><span class="identifier">requisition_stack</span><span class="plain"> + </span><span class="identifier">requisition_stack_pointer</span><span class="plain">*</span><span class="identifier">WORDSIZE</span><span class="plain">;</span>
|
|
<span class="comment">! print "Allocating ", addr, " at pointer ", requisition_stack_pointer, "^";</span>
|
|
<span class="identifier">requisition_stack_pointer</span><span class="plain"> = </span><span class="identifier">top</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">addr</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">FreeStack</span><span class="plain"> </span><span class="identifier">addr</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">addr</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">requisition_stack_pointer</span><span class="plain"> = (</span><span class="identifier">addr</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">requisition_stack</span><span class="plain">)/</span><span class="identifier">WORDSIZE</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. WriteListOfMarkedObjects. </b>This routine will use the <code class="display"><span class="extract">MarkedListIterator</span></code>. That means it has to create
|
|
an array containing the object numbers of every object with the <code class="display"><span class="extract">workflag2</span></code>
|
|
attribute set, placing the address of this array in <code class="display"><span class="extract">MarkedObjectArray</span></code> and
|
|
the length in <code class="display"><span class="extract">MarkedObjectLength</span></code>. Note that we preserve any existing
|
|
marked list on the stack (using the assembly-language instructions <code class="display"><span class="extract">@push</span></code>
|
|
and <code class="display"><span class="extract">@pull</span></code>) for the duration of our use.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">While the final order of this list will depend on what it looks like after
|
|
coalescing, the initial order is also important. If all of the objects have
|
|
a common parent in the object tree, then we coalesce those objects and
|
|
place the list in object tree order. But if not, we place the list in
|
|
object number order (which is essentially the order of traversal of the
|
|
initial state of the object tree: thus objects in Room A will all appear
|
|
before objects in Room B if A was created before B in the source text).
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">MarkedObjectArray</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">MarkedObjectLength</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">WriteListOfMarkedObjects</span><span class="plain"> </span><span class="identifier">in_style</span>
|
|
<span class="identifier">obj</span><span class="plain"> </span><span class="identifier">common_parent</span><span class="plain"> </span><span class="identifier">first</span><span class="plain"> </span><span class="identifier">mixed_parentage</span><span class="plain"> </span><span class="identifier">length</span><span class="plain"> </span><span class="identifier">g</span><span class="plain"> </span><span class="identifier">gc</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">gc</span><span class="plain"> = </span><span class="constant">-2</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain"> && </span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">workflag2</span><span class="plain">) {</span>
|
|
<span class="identifier">length</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">first</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) { </span><span class="identifier">first</span><span class="plain"> = </span><span class="identifier">obj</span><span class="plain">; </span><span class="identifier">common_parent</span><span class="plain"> = </span><span class="reserved">parent</span><span class="plain">(</span><span class="identifier">obj</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="reserved">parent</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">) ~= </span><span class="identifier">common_parent</span><span class="plain">) </span><span class="identifier">mixed_parentage</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">; }</span>
|
|
<span class="identifier">g</span><span class="plain"> = </span><span class="identifier">GetGNAOfObject</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">); </span><span class="identifier">g</span><span class="plain"> = </span><span class="identifier">g</span><span class="plain">%3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gc</span><span class="plain"> == </span><span class="constant">-2</span><span class="plain">) </span><span class="identifier">gc</span><span class="plain"> = </span><span class="identifier">g</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">gc</span><span class="plain"> ~= </span><span class="identifier">g</span><span class="plain">) </span><span class="identifier">gc</span><span class="plain"> = </span><span class="constant">-1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mixed_parentage</span><span class="plain">) </span><span class="identifier">common_parent</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">length</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">in_style</span><span class="plain"> & </span><span class="identifier">ISARE_BIT</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'W'</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">in_style</span><span class="plain"> & </span><span class="identifier">CFIRSTART_BIT</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'X'</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'Y'</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">MarkedObjectArray</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">MarkedObjectLength</span><span class="plain">;</span>
|
|
<span class="identifier">MarkedObjectArray</span><span class="plain"> = </span><span class="identifier">RequisitionStack</span><span class="plain">(</span><span class="identifier">length</span><span class="plain">);</span>
|
|
<span class="identifier">MarkedObjectLength</span><span class="plain"> = </span><span class="identifier">length</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">MarkedObjectArray</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_LISTWRITERMEMORY</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">common_parent</span><span class="plain">) {</span>
|
|
<span class="identifier">ObjectTreeCoalesce</span><span class="plain">(</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">common_parent</span><span class="plain">));</span>
|
|
<span class="identifier">length</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">in</span><span class="plain"> </span><span class="identifier">common_parent</span><span class="plain">) </span><span class="comment">! object tree order</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">workflag2</span><span class="plain">) </span><span class="identifier">MarkedObjectArray</span><span class="plain">--></span><span class="identifier">length</span><span class="plain">++ = </span><span class="identifier">obj</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">length</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) </span><span class="comment">! object number order</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">workflag2</span><span class="plain">) </span><span class="identifier">MarkedObjectArray</span><span class="plain">--></span><span class="identifier">length</span><span class="plain">++ = </span><span class="identifier">obj</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">WriteListFrom</span><span class="plain">(</span><span class="identifier">first</span><span class="plain">, </span><span class="identifier">in_style</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="reserved">false</span><span class="plain">, </span><span class="identifier">MarkedListIterator</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">FreeStack</span><span class="plain">(</span><span class="identifier">MarkedObjectArray</span><span class="plain">);</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">MarkedObjectLength</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">MarkedObjectArray</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">prior_named_list</span><span class="plain"> = </span><span class="identifier">length</span><span class="plain">;</span>
|
|
<span class="identifier">prior_named_list_gender</span><span class="plain"> = </span><span class="identifier">gc</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. List Number and Gender. </b>As a brief parenthesis, the same algorithm can be used to work out the
|
|
prior named list number and gender for everything matching a description.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">RegardingMarkedObjects</span>
|
|
<span class="identifier">obj</span><span class="plain"> </span><span class="identifier">length</span><span class="plain"> </span><span class="identifier">g</span><span class="plain"> </span><span class="identifier">gc</span><span class="plain">;</span>
|
|
<span class="identifier">gc</span><span class="plain"> = </span><span class="constant">-2</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain"> && </span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">workflag2</span><span class="plain">) {</span>
|
|
<span class="identifier">length</span><span class="plain">++;</span>
|
|
<span class="identifier">g</span><span class="plain"> = </span><span class="identifier">GetGNAOfObject</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">); </span><span class="identifier">g</span><span class="plain"> = </span><span class="identifier">g</span><span class="plain">%3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gc</span><span class="plain"> == </span><span class="constant">-2</span><span class="plain">) {</span>
|
|
<span class="identifier">gc</span><span class="plain"> = </span><span class="identifier">g</span><span class="plain">;</span>
|
|
<span class="identifier">prior_named_noun</span><span class="plain"> = </span><span class="identifier">obj</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">gc</span><span class="plain"> ~= </span><span class="identifier">g</span><span class="plain">) </span><span class="identifier">gc</span><span class="plain"> = </span><span class="constant">-1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">prior_named_list</span><span class="plain"> = </span><span class="identifier">length</span><span class="plain">;</span>
|
|
<span class="identifier">prior_named_list_gender</span><span class="plain"> = </span><span class="identifier">gc</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">length</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">prior_named_noun</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">; </span><span class="identifier">prior_named_list_gender</span><span class="plain"> = </span><span class="constant">-1</span><span class="plain">; }</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">PNToVP</span><span class="plain"> </span><span class="identifier">gna</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prior_named_noun</span><span class="plain"> == </span><span class="identifier">player</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">story_viewpoint</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prior_named_noun</span><span class="plain">) </span><span class="identifier">gna</span><span class="plain"> = </span><span class="identifier">GetGNAOfObject</span><span class="plain">(</span><span class="identifier">prior_named_noun</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">gna</span><span class="plain">%6)/3 == </span><span class="constant">1</span><span class="plain">) || (</span><span class="identifier">prior_named_list</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="constant">6</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">3</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. List Writer Regard Storage. </b>This is somewhat hacky, but enables "[regarding list writer internals]".
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">LWI_Storage</span><span class="plain"> </span><span class="constant">--</span><span class="plain">> </span><span class="constant">1</span><span class="plain"> (-1) </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">[ </span><span class="identifier">SetLWI</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">b</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="identifier">LWI_Storage</span><span class="plain">-->0 = </span><span class="identifier">a</span><span class="plain">;</span>
|
|
<span class="identifier">LWI_Storage</span><span class="plain">-->1 = </span><span class="identifier">b</span><span class="plain">;</span>
|
|
<span class="identifier">LWI_Storage</span><span class="plain">-->2 = </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
<span class="plain">[ </span><span class="identifier">RegardingLWI</span><span class="plain">;</span>
|
|
<span class="identifier">prior_named_list</span><span class="plain"> = </span><span class="identifier">LWI_Storage</span><span class="plain">-->0;</span>
|
|
<span class="identifier">prior_named_list_gender</span><span class="plain"> = </span><span class="identifier">LWI_Storage</span><span class="plain">-->1;</span>
|
|
<span class="identifier">prior_named_noun</span><span class="plain"> = </span><span class="identifier">LWI_Storage</span><span class="plain">-->2;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Response Printing. </b>From which:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">ResponseViaActivity</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">prior_named_noun</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">prior_named_list</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">prior_named_list_gender</span><span class="plain">;</span>
|
|
<span class="identifier">RegardingSingleObject</span><span class="plain">(</span><span class="reserved">nothing</span><span class="plain">);</span>
|
|
<span class="identifier">CarryOutActivity</span><span class="plain">(</span><span class="identifier">PRINTING_RESPONSE_ACT</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">prior_named_list_gender</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">prior_named_list</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">prior_named_noun</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. About Iterator Functions. </b>Suppose <code class="display"><span class="extract">Iter</span></code> is an iterator function and that we have a "raw list"
|
|
x_1, x_2, ..., x_n of objects. Of these, the iterator function will
|
|
choose a sublist of "qualifying" objects. It is called with arguments
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">Iter(obj, depth, L, function)</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">where the <code class="display"><span class="extract">obj</span></code> is required to be x_j for some j and the function is one
|
|
of the <code class="display"><span class="extract">*_ITF</span></code> constants defined below:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(a) On <code class="display"><span class="extract">START_ITF</span></code>, we return x_1, or <code class="display"><span class="extract">nothing</span></code> if the list is empty.
|
|
</li></ul>
|
|
<ul class="items"><li>(b) On <code class="display"><span class="extract">SEEK_ITF</span></code>, we return the smallest k>= j such that x_k qualifies,
|
|
or <code class="display"><span class="extract">nothing</span></code> if none of x_j, x_{j+1}, ..., x_n qualify.
|
|
</li></ul>
|
|
<ul class="items"><li>(c) On <code class="display"><span class="extract">ADVANCE_ITF</span></code>, we return the smallest k > j such that x_k qualifies,
|
|
or <code class="display"><span class="extract">nothing</span></code> if none of x_{j+1}, x_{j+2} ..., x_n qualify.
|
|
</li></ul>
|
|
<ul class="items"><li>(d) On <code class="display"><span class="extract">COALESCE_ITF</span></code>, we coalesce the entire list (not merely the qualifying
|
|
entries) and return the new x_1, or <code class="display"><span class="extract">nothing</span></code> if the list is empty.
|
|
</li></ul>
|
|
<p class="inwebparagraph">Thus, given any x_i, we can produce the sublist of qualifying entries by
|
|
performing <code class="display"><span class="extract">START_ITF</span></code> on x_i, then <code class="display"><span class="extract">SEEK_ITF</span></code>, to produce q_1; then
|
|
<code class="display"><span class="extract">ADVANCE_ITF</span></code> to produce q_2, and so on until <code class="display"><span class="extract">nothing</span></code> is returned, when
|
|
there are no more qualifying entries. <code class="display"><span class="extract">SEEK_ITF</span></code> and <code class="display"><span class="extract">ADVANCE_ITF</span></code> always
|
|
return qualifying objects, or <code class="display"><span class="extract">nothing</span></code>; but <code class="display"><span class="extract">START_ITF</span></code> and <code class="display"><span class="extract">COALESCE_ITF</span></code>
|
|
may return a non-qualifying object, since there's no reason why x_1 should
|
|
qualify in any ordering.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The iterator can make its own choice of which entries qualify, and of what
|
|
the raw list is; <code class="display"><span class="extract">depth</span></code> is supplied to help in that decision. But if <code class="display"><span class="extract">L</span></code>
|
|
is non-zero then the iterator is required to disqualify any entry whose
|
|
<code class="display"><span class="extract">list_together</span></code> value is not <code class="display"><span class="extract">L</span></code>.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">SEEK_ITF</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">ADVANCE_ITF</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">COALESCE_ITF</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">START_ITF</span><span class="plain"> = </span><span class="constant">3</span><span class="plain">;</span>
|
|
|
|
<span class="comment">! Constant DBLW; ! Uncomment this to provide debugging information at run-time</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Marked List Iterator. </b>Here the raw list is provided by the <code class="display"><span class="extract">MarkedObjectArray</span></code>, which is convenient
|
|
for coalescing, but not so helpful for translating the <code class="display"><span class="extract">obj</span></code> parameter into
|
|
the i such that it is x_i. We simply search from the beginning to do
|
|
this, which combined with other code using the iterator makes for some
|
|
unnecessary O(n^2) calculations. But it saves memory and nuisance, and the
|
|
iterator is used only with printing to the screen, which never needs to be
|
|
very rapid anyway (because the player can only read very slowly).
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">MarkedListIterator</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain"> </span><span class="identifier">required_lt</span><span class="plain"> </span><span class="identifier">function</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">obj</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">required_lt</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">required_lt</span><span class="plain"> = </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">;</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">function</span><span class="plain">) {</span>
|
|
<span class="identifier">START_ITF</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">MarkedObjectArray</span><span class="plain">-->0;</span>
|
|
<span class="identifier">COALESCE_ITF</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">MarkedListCoalesce</span><span class="plain">();</span>
|
|
<span class="identifier">SEEK_ITF</span><span class="plain">, </span><span class="identifier">ADVANCE_ITF</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">MarkedObjectLength</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">MarkedObjectArray</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="reserved">if</span><span class="plain"> (</span><span class="identifier">function</span><span class="plain"> == </span><span class="identifier">ADVANCE_ITF</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"><</span><span class="identifier">MarkedObjectLength</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">MarkedObjectArray</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">LT_Compare</span><span class="plain">(</span><span class="identifier">required_lt</span><span class="plain">, </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">required_lt</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">WORKFLAG_BIT</span><span class="plain">) && (</span><span class="identifier">depth</span><span class="plain">==0) && (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">workflag</span><span class="plain">))</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">CONCEAL_BIT</span><span class="plain">) && (</span><span class="identifier">ConcealedFromLists</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">))) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">return</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="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Concealment. </b>This is the definition of concealment used by the list-writer, and means that,
|
|
for example, the "deciding the concealed possessions" activity is taken into
|
|
account.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">ConcealedFromLists</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">concealed</span><span class="plain">) || (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">scenery</span><span class="plain">)) </span><span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="identifier">c</span><span class="plain"> = </span><span class="reserved">parent</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain">) && (</span><span class="identifier">c</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">K5_container</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">K6_supporter</span><span class="plain">) && (</span><span class="identifier">TestConcealment</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">, </span><span class="identifier">obj</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="SP10"></a><b>§10. Coalesce Marked List. </b>The return value is the new first entry in the raw list.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">MarkedListCoalesce</span><span class="plain"> </span><span class="identifier">o</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">lt</span><span class="plain"> </span><span class="identifier">l</span><span class="plain"> </span><span class="identifier">swap</span><span class="plain"> </span><span class="identifier">m</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">MarkedObjectLength</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="identifier">lt</span><span class="plain"> = (</span><span class="identifier">MarkedObjectArray</span><span class="plain">--></span><span class="identifier">i</span><span class="plain">).</span><span class="identifier">list_together</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">, </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="comment">! Find first object in list after contiguous run with this list_together value:</span>
|
|
<span class="reserved">for</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">MarkedObjectLength</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">LT_Compare</span><span class="plain">((</span><span class="identifier">MarkedObjectArray</span><span class="plain">--></span><span class="identifier">i</span><span class="plain">).</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">lt</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="comment">! If the contiguous run extends to end of list, the list is now perfect:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> == </span><span class="identifier">MarkedObjectLength</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">MarkedObjectArray</span><span class="plain">-->0;</span>
|
|
<span class="comment">! And otherwise we look to see if any future entries belong in the earlier run:</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">+1: </span><span class="identifier">l</span><span class="plain"><</span><span class="identifier">MarkedObjectLength</span><span class="plain">: </span><span class="identifier">l</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LT_Compare</span><span class="plain">((</span><span class="identifier">MarkedObjectArray</span><span class="plain">--></span><span class="identifier">l</span><span class="plain">).</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">lt</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="comment">! Yes, they do: so we perform a rotation to insert it before element i:</span>
|
|
<span class="identifier">swap</span><span class="plain"> = </span><span class="identifier">MarkedObjectArray</span><span class="plain">--></span><span class="identifier">l</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">m</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">: </span><span class="identifier">m</span><span class="plain">></span><span class="identifier">i</span><span class="plain">: </span><span class="identifier">m</span><span class="plain">--) </span><span class="identifier">MarkedObjectArray</span><span class="plain">--></span><span class="identifier">m</span><span class="plain"> = </span><span class="identifier">MarkedObjectArray</span><span class="plain">-->(</span><span class="identifier">m</span><span class="plain">-1);</span>
|
|
<span class="identifier">MarkedObjectArray</span><span class="plain">--></span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">swap</span><span class="plain">;</span>
|
|
<span class="comment">! And now the run is longer:</span>
|
|
<span class="identifier">i</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> == </span><span class="identifier">MarkedObjectLength</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">MarkedObjectArray</span><span class="plain">-->0;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">i</span><span class="plain">--;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">MarkedObjectArray</span><span class="plain">-->0;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. Object Tree Iterator. </b>Here the raw list is the list of all children of a given parent: since the
|
|
argument <code class="display"><span class="extract">obj</span></code> is required to be a member of the raw list, we can use
|
|
<code class="display"><span class="extract">parent(obj)</span></code> to find it. Now seeking and advancing are fast, but coalescing
|
|
is slower.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">list_filter_routine</span><span class="plain">;</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">ObjectTreeIterator</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain"> </span><span class="identifier">required_lt</span><span class="plain"> </span><span class="identifier">function</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">obj</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) || (</span><span class="reserved">parent</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">) == </span><span class="reserved">nothing</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">function</span><span class="plain"> == </span><span class="identifier">START_ITF</span><span class="plain">) </span><span class="identifier">obj</span><span class="plain"> = </span><span class="reserved">child</span><span class="plain">(</span><span class="reserved">parent</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">function</span><span class="plain"> == </span><span class="identifier">COALESCE_ITF</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">ObjectTreeCoalesce</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">function</span><span class="plain"> == </span><span class="identifier">ADVANCE_ITF</span><span class="plain">) </span><span class="identifier">obj</span><span class="plain"> = </span><span class="reserved">sibling</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">required_lt</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">required_lt</span><span class="plain"> = </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (:: </span><span class="identifier">obj</span><span class="plain"> = </span><span class="reserved">sibling</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="comment">!if (function == ADVANCE_ITF) print "Considering ", (the) obj, ": ", (TEXT_TY_Say) obj.list_together, ": ", (TEXT_TY_Say) required_lt, ": ", ": ", (TEXT_TY_Say) lt_value, ": ", LT_Compare(obj.list_together, required_lt), "^";</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">required_lt</span><span class="plain">, </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">required_lt</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">WORKFLAG_BIT</span><span class="plain">) && (</span><span class="identifier">depth</span><span class="plain">==0) && (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">workflag</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">obj</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">list_filter_permits</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">CONCEAL_BIT</span><span class="plain">) && (</span><span class="identifier">ConcealedFromLists</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">))) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Coalesce Object Tree. </b>Again, the return value is the new first entry in the raw list.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">ObjectTreeCoalesce</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">memb</span><span class="plain"> </span><span class="identifier">lt</span><span class="plain"> </span><span class="identifier">later</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">DBLW</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"^^Sorting out: "</span><span class="plain">; </span><span class="identifier">DiagnoseSortList</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">); #</span><span class="identifier">Endif</span><span class="plain">;</span>
|
|
<span class="plain">.</span><span class="identifier">StartAgain</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">memb</span><span class="plain">=</span><span class="identifier">obj</span><span class="plain">: </span><span class="identifier">memb</span><span class="plain">~=</span><span class="reserved">nothing</span><span class="plain">: </span><span class="identifier">memb</span><span class="plain">=</span><span class="reserved">sibling</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">)) {</span>
|
|
<span class="identifier">lt</span><span class="plain"> = </span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">, </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="comment">! Find first object in list after contiguous run with this list_together value:</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">memb</span><span class="plain">=</span><span class="reserved">sibling</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">):</span>
|
|
<span class="plain">(</span><span class="identifier">memb</span><span class="plain">) && (</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">lt</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">): </span><span class="identifier">memb</span><span class="plain"> = </span><span class="reserved">sibling</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">)) ;</span>
|
|
<span class="comment">! If the contiguous run extends to end of list, the list is now perfect:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">memb</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">obj</span><span class="plain">;</span>
|
|
<span class="comment">! And otherwise we look to see if any future entries belong in the earlier run:</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">later</span><span class="plain">=</span><span class="reserved">sibling</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">): </span><span class="identifier">later</span><span class="plain">: </span><span class="identifier">later</span><span class="plain">=</span><span class="reserved">sibling</span><span class="plain">(</span><span class="identifier">later</span><span class="plain">))</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">later</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">lt</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="comment">! Yes, they do: so we perform a regrouping of the list and start again:</span>
|
|
<span class="identifier">obj</span><span class="plain"> = </span><span class="identifier">GroupChildren</span><span class="plain">(</span><span class="reserved">parent</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">), </span><span class="identifier">lt</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">DBLW</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"^^Sorted to: "</span><span class="plain">; </span><span class="identifier">DiagnoseSortList</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">); #</span><span class="identifier">Endif</span><span class="plain">;</span>
|
|
<span class="reserved">jump</span><span class="plain"> </span><span class="identifier">StartAgain</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. GroupChildren. </b>The following runs through the child-objects of <code class="display"><span class="extract">par</span></code> in the I6 object tree,
|
|
and moves those having a given <code class="display"><span class="extract">list_property</span></code> property value together, to
|
|
become the eldest children. It preserves the ordering in between those
|
|
objects, and also in between those not having that property value.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We do this by temporarily moving objects into and out of <code class="display"><span class="extract">in_obj</span></code> and <code class="display"><span class="extract">out_obj</span></code>,
|
|
objects which in all other circumstances never have children in the tree.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">GroupChildren</span><span class="plain"> </span><span class="identifier">par</span><span class="plain"> </span><span class="identifier">value</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">par</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">LT_Compare</span><span class="plain">(</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">par</span><span class="plain">).</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="reserved">move</span><span class="plain"> </span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">par</span><span class="plain">) </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">out_obj</span><span class="plain">;</span>
|
|
<span class="reserved">else</span>
|
|
<span class="reserved">move</span><span class="plain"> </span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">par</span><span class="plain">) </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">in_obj</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">in_obj</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">move</span><span class="plain"> </span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">in_obj</span><span class="plain">) </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">par</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">out_obj</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">move</span><span class="plain"> </span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">out_obj</span><span class="plain">) </span><span class="reserved">to</span><span class="plain"> </span><span class="identifier">par</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">par</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">DBLW</span><span class="plain">;</span>
|
|
<span class="plain">[ </span><span class="identifier">DiagnoseSortList</span><span class="plain"> </span><span class="identifier">obj</span><span class="plain"> </span><span class="identifier">memb</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">memb</span><span class="plain">=</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">obj</span><span class="plain">): </span><span class="identifier">memb</span><span class="plain">~=</span><span class="reserved">nothing</span><span class="plain">: </span><span class="identifier">memb</span><span class="plain">=</span><span class="reserved">sibling</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">)) </span><span class="reserved">print</span><span class="plain"> </span><span class="identifier">memb</span><span class="plain">, </span><span class="string">" --> "</span><span class="plain">; </span><span class="reserved">new_line</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
<span class="plain">#</span><span class="identifier">Endif</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. WriteListFrom. </b>And here we go at last. Or at any rate we initialise the quartet of global
|
|
variables detailing the current list-writing process, and begin.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">WriteListFrom</span><span class="plain"> </span><span class="identifier">first</span><span class="plain"> </span><span class="identifier">in_style</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain"> </span><span class="identifier">noactivity</span><span class="plain"> </span><span class="identifier">iter</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">ol</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">c_iterator</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">c_style</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">c_depth</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">c_margin</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">iter</span><span class="plain">) </span><span class="identifier">c_iterator</span><span class="plain"> = </span><span class="identifier">iter</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">c_iterator</span><span class="plain"> = </span><span class="identifier">ObjectTreeIterator</span><span class="plain">;</span>
|
|
<span class="identifier">c_style</span><span class="plain"> = </span><span class="identifier">in_style</span><span class="plain">; </span><span class="identifier">c_depth</span><span class="plain"> = </span><span class="identifier">depth</span><span class="plain">;</span>
|
|
<span class="identifier">c_margin</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">in_style</span><span class="plain"> & </span><span class="identifier">EXTRAINDENT_BIT</span><span class="plain">) </span><span class="identifier">c_margin</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain"> </span><span class="reserved">ofclass</span><span class="plain"> </span><span class="identifier">Object</span><span class="plain">) {</span>
|
|
<span class="reserved">give</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">list_filter_permits</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">list_filter_routine</span><span class="plain">) && (</span><span class="identifier">list_filter_routine</span><span class="plain">(</span><span class="identifier">a</span><span class="plain">) == </span><span class="reserved">false</span><span class="plain">))</span>
|
|
<span class="reserved">give</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> ~</span><span class="identifier">list_filter_permits</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">first</span><span class="plain"> = </span><span class="identifier">c_iterator</span><span class="plain">(</span><span class="identifier">first</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">START_ITF</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">first</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">in_style</span><span class="plain"> & </span><span class="identifier">ISARE_BIT</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'W'</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'Y'</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">in_style</span><span class="plain"> & </span><span class="identifier">NEWLINE_BIT</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">new_line</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">noactivity</span><span class="plain">) || (</span><span class="identifier">iter</span><span class="plain">)) {</span>
|
|
<span class="identifier">WriteListR</span><span class="plain">(</span><span class="identifier">first</span><span class="plain">, </span><span class="identifier">c_depth</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
|
|
<span class="identifier">say__p</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">ol</span><span class="plain"> </span><span class="reserved">provides</span><span class="plain"> </span><span class="identifier">list_together</span><span class="plain">)</span>
|
|
<span class="identifier">BlkValueCopy</span><span class="plain">(</span><span class="identifier">ol</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">);</span>
|
|
<span class="identifier">CarryOutActivity</span><span class="plain">(</span><span class="identifier">LISTING_CONTENTS_ACT</span><span class="plain">, </span><span class="reserved">parent</span><span class="plain">(</span><span class="identifier">first</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">c_margin</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">c_depth</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">c_style</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">c_iterator</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Standard Contents Listing Rule. </b>The default for the listing contents activity is to call this rule in its
|
|
"for" stage: note that this suppresses the use of the activity, to avoid
|
|
an infinite regress. The activity is used only for the default
|
|
<code class="display"><span class="extract">ObjectTreeIterator</span></code>, so there is no need to specify which is used.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">STANDARD_CONTENTS_LISTING_R</span><span class="plain">;</span>
|
|
<span class="identifier">WriteListFrom</span><span class="plain">(</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">parameter_value</span><span class="plain">), </span><span class="identifier">c_style</span><span class="plain">, </span><span class="identifier">c_depth</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. Partitioning. </b>Given qualifying objects x_1, ..., x_j, we partition them into classes of
|
|
the equivalence relation x_i~ x_j if and only
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(i) they both have a <code class="display"><span class="extract">plural</span></code> property (not necessarily the same), and
|
|
</li><li>(ii) neither will cause the list-maker to recurse downwards to show the
|
|
objects inside or on top of them, and
|
|
</li><li>(iii) if they cause the list-maker to add information about whether they
|
|
are worn, lighted or open, then it will add the same information about both, and
|
|
</li><li>(iv) they are considered identical by the parser, in that they respond to the
|
|
same syntaxes of name: so that it is impossible to find a TAKE X command such
|
|
that X matches one and not the other.
|
|
</li></ul>
|
|
<p class="inwebparagraph">The equivalence classes are numbered consecutively upwards from 1 to n,
|
|
in order of first appearance in the list. For each object x_i,
|
|
<code class="display"><span class="extract">partition_classes->(i-1)</span></code> is the number of its equivalence class. For each
|
|
equivalence class number c, <code class="display"><span class="extract">partition_class_sizes->c</span></code> is the number of
|
|
objects in this class.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">DBLW</span><span class="plain">;</span>
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">DBLW_no_classes</span><span class="plain">; </span><span class="identifier">Global</span><span class="plain"> </span><span class="identifier">DBLW_no_objs</span><span class="plain">;</span>
|
|
<span class="plain">[ </span><span class="identifier">DebugPartition</span><span class="plain"> </span><span class="identifier">partition_class_sizes</span><span class="plain"> </span><span class="identifier">partition_classes</span><span class="plain"> </span><span class="identifier">first</span><span class="plain"> </span><span class="identifier">depth</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">o</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"[Length of list is "</span><span class="plain">, </span><span class="identifier">DBLW_no_objs</span><span class="plain">, </span><span class="string">" with "</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">, </span><span class="string">" plural.]^"</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"[Partitioned into "</span><span class="plain">, </span><span class="identifier">DBLW_no_classes</span><span class="plain">, </span><span class="string">" equivalence classes.]^"</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">DBLW_no_classes</span><span class="plain"> : </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"Class "</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="string">" has size "</span><span class="plain">, </span><span class="identifier">partition_class_sizes</span><span class="plain">-></span><span class="identifier">i</span><span class="plain">, </span><span class="string">"^"</span><span class="plain">;</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">o</span><span class="plain">=</span><span class="identifier">first</span><span class="plain">: </span><span class="identifier">k</span><span class="plain"><</span><span class="identifier">DBLW_no_objs</span><span class="plain"> : </span><span class="identifier">k</span><span class="plain">++, </span><span class="identifier">o</span><span class="plain"> = </span><span class="identifier">c_iterator</span><span class="plain">(</span><span class="identifier">o</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">, </span><span class="identifier">ADVANCE_ITF</span><span class="plain">)) {</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"Entry "</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">, </span><span class="string">" has class "</span><span class="plain">, </span><span class="identifier">partition_classes</span><span class="plain">-></span><span class="identifier">k</span><span class="plain">,</span>
|
|
<span class="string">" represented by "</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">, </span><span class="string">" with L="</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
<span class="plain">#</span><span class="identifier">Endif</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. Partition List. </b>The following creates the <code class="display"><span class="extract">partition_classes</span></code> and <code class="display"><span class="extract">partition_class_sizes</span></code>
|
|
accordingly. We return n, the number of classes.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">PartitionList</span><span class="plain"> </span><span class="identifier">first</span><span class="plain"> </span><span class="identifier">no_objs</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain"> </span><span class="identifier">partition_classes</span><span class="plain"> </span><span class="identifier">partition_class_sizes</span>
|
|
<span class="identifier">i</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> </span><span class="identifier">l</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="identifier">m</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_objs</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">partition_classes</span><span class="plain">-></span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="constant">1</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">first</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">no_objs</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">c_iterator</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">, </span><span class="identifier">ADVANCE_ITF</span><span class="plain">), </span><span class="identifier">k</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">partition_classes</span><span class="plain">-></span><span class="identifier">k</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">partition_classes</span><span class="plain">-></span><span class="identifier">k</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">partition_class_sizes</span><span class="plain">-></span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">c_iterator</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">, </span><span class="identifier">ADVANCE_ITF</span><span class="plain">), </span><span class="identifier">m</span><span class="plain">=</span><span class="identifier">k</span><span class="plain">+1:</span>
|
|
<span class="plain">(</span><span class="identifier">l</span><span class="plain">~=0) && (</span><span class="identifier">m</span><span class="plain"><</span><span class="identifier">no_objs</span><span class="plain">):</span>
|
|
<span class="identifier">l</span><span class="plain">=</span><span class="identifier">c_iterator</span><span class="plain">(</span><span class="identifier">l</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">, </span><span class="identifier">ADVANCE_ITF</span><span class="plain">), </span><span class="identifier">m</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">partition_classes</span><span class="plain">-></span><span class="identifier">m</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">ListEqual</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">l</span><span class="plain">))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">partition_class_sizes</span><span class="plain">-></span><span class="identifier">n</span><span class="plain"> < </span><span class="constant">255</span><span class="plain">) (</span><span class="identifier">partition_class_sizes</span><span class="plain">-></span><span class="identifier">n</span><span class="plain">)++;</span>
|
|
<span class="identifier">partition_classes</span><span class="plain">-></span><span class="identifier">m</span><span class="plain"> = </span><span class="identifier">n</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">n</span><span class="plain"> < </span><span class="constant">255</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">n</span><span class="plain">--;</span>
|
|
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">DBLW</span><span class="plain">;</span>
|
|
<span class="identifier">DBLW_no_classes</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">DBLW_no_objs</span><span class="plain"> = </span><span class="identifier">no_objs</span><span class="plain">;</span>
|
|
<span class="identifier">DebugPartition</span><span class="plain">(</span><span class="identifier">partition_class_sizes</span><span class="plain">, </span><span class="identifier">partition_classes</span><span class="plain">, </span><span class="identifier">first</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">Endif</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. Equivalence Relation. </b>The above algorithm will fail unless <code class="display"><span class="extract">ListEqual</span></code> is indeed reflexive, symmetric
|
|
and transitive, which ultimately depends on the care with which <code class="display"><span class="extract">Identical</span></code>
|
|
is implemented, which in turn hangs on the <code class="display"><span class="extract">parse_noun</span></code> properties compiled
|
|
by NI. But this seems to be sound.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">ListEqual</span><span class="plain"> </span><span class="identifier">o1</span><span class="plain"> </span><span class="identifier">o2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">o1</span><span class="plain">.</span><span class="identifier">plural</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">o2</span><span class="plain">.</span><span class="identifier">plural</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">if</span><span class="plain"> (</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">o1</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain"> && </span><span class="identifier">WillRecurs</span><span class="plain">(</span><span class="identifier">o1</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">if</span><span class="plain"> (</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">o2</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain"> && </span><span class="identifier">WillRecurs</span><span class="plain">(</span><span class="identifier">o2</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">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & (</span><span class="identifier">FULLINV_BIT</span><span class="plain"> + </span><span class="identifier">PARTINV_BIT</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">o1</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">worn</span><span class="plain"> && </span><span class="identifier">o2</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">worn</span><span class="plain">) || (</span><span class="identifier">o2</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">worn</span><span class="plain"> && </span><span class="identifier">o1</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">worn</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">o1</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">light</span><span class="plain"> && </span><span class="identifier">o2</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">light</span><span class="plain">) || (</span><span class="identifier">o2</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">light</span><span class="plain"> && </span><span class="identifier">o1</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">light</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">o1</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">container</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o2</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">container</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">o1</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">open</span><span class="plain"> && </span><span class="identifier">o2</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">open</span><span class="plain">) || (</span><span class="identifier">o2</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">open</span><span class="plain"> && </span><span class="identifier">o1</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">open</span><span class="plain">))</span>
|
|
<span class="reserved">rfalse</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">o2</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">container</span><span class="plain">)</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Identical</span><span class="plain">(</span><span class="identifier">o1</span><span class="plain">, </span><span class="identifier">o2</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">WillRecurs</span><span class="plain"> </span><span class="identifier">o</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">ALWAYS_BIT</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">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">RECURSE_BIT</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">if</span><span class="plain"> ((</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">supporter</span><span class="plain">) || ((</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">container</span><span class="plain">) && (</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">open</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">transparent</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="SP19"></a><b>§19. Grouping. </b>A "group" is a maximally-sized run of one or more adjacent partition
|
|
classes in the list whose first members have a common value of
|
|
<code class="display"><span class="extract">list_together</span></code> which is a routine or string, and which is not equal to
|
|
<code class="display"><span class="extract">lt_value</span></code>, the current grouping value. (As we see below, it's by setting
|
|
<code class="display"><span class="extract">lt_value</span></code> that we restrict attention to a particular group: if we reacted
|
|
to that as a <code class="display"><span class="extract">list_together</span></code> value here, then we would simply go around in
|
|
circles, and never be able to see the individual objects in the group.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">For instance, suppose we have objects with <code class="display"><span class="extract">list_together</span></code> values as follows,
|
|
where R_1 and R_2 are addresses of routines:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">coin| ($R_1$), |coin| ($R_1$), |box| ($R_2$), |statuette| (0), |coin| ($R_1$), |box</span>
|
|
(R_2)</pre>
|
|
|
|
<p class="inwebparagraph">Then the partition is 1, 1, 2, 3, 1, 2, so that the final output will be
|
|
something like "three coins, two boxes and a statuette" — with three
|
|
grouped terms. Here each partition class is the only member in its group,
|
|
so the number of groups is the same as the number of classes. (The above
|
|
list is not coalesced, so the R_1 values, for instance, are not
|
|
contiguous: we need to work in general with non-coalesced lists because
|
|
not every iterator function will be able to coalesce fully.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">But if we have something like this:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">coin| ($R_1$), |Q| ($R_2$), |W| ($R_2$), |coin| ($R_1$), |statuette| (0), |E| ($R_2$), |R</span>
|
|
(R_2)</pre>
|
|
|
|
<p class="inwebparagraph">then the partition is 1, 2, 3, 1, 4, 5, 6 and we have six classes in all.
|
|
But classes 2 and 3 are grouped together, as are classes 5 and 6, so we
|
|
end up with a list having just four groups: "two coins, the letters Q and
|
|
W from a Scrabble set, a statuette and the letters E and R from a Scrabble
|
|
set". (Again, this list has not been fully coalesced: if it had been, it
|
|
would be reordered <code class="display"><span class="extract">coin</span></code>, <code class="display"><span class="extract">coin</span></code>, <code class="display"><span class="extract">Q</span></code>, <code class="display"><span class="extract">W</span></code>, <code class="display"><span class="extract">E</span></code>, <code class="display"><span class="extract">R</span></code>, <code class="display"><span class="extract">statuette</span></code>, with
|
|
partition 1, 1, 2, 3, 4, 5, 6, and three groups: "two coins, the letters Q,
|
|
W, E and R from a Scrabble set and a statuette".)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The reason we do not group together classes with a common non-zero
|
|
<code class="display"><span class="extract">list_together</span></code> which is not a routine or string is that low values
|
|
of <code class="display"><span class="extract">list_together</span></code> are used in coalescing the list into a pleasing order
|
|
(say, moving all of the key-like items together) but not in grouping: see
|
|
<code class="display"><span class="extract">list_together</span></code> in the Inform Designer's Manual, 4th edition.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We calculate the number of groups by starting with the number of classes
|
|
and then subtracting one each time two adjacent classes share <code class="display"><span class="extract">list_together</span></code>
|
|
in the above sense.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">NumberOfGroupsInList</span><span class="plain"> </span><span class="identifier">o</span><span class="plain"> </span><span class="identifier">no_classes</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain"> </span><span class="identifier">partition_classes</span><span class="plain"> </span><span class="identifier">partition_class_sizes</span>
|
|
<span class="identifier">no_groups</span><span class="plain"> </span><span class="identifier">cl</span><span class="plain"> </span><span class="identifier">memb</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> </span><span class="identifier">current_lt</span><span class="plain"> </span><span class="identifier">lt</span><span class="plain">;</span>
|
|
<span class="identifier">current_lt</span><span class="plain"> = </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">;</span>
|
|
<span class="identifier">lt</span><span class="plain"> = </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">;</span>
|
|
<span class="identifier">no_groups</span><span class="plain"> = </span><span class="identifier">no_classes</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">cl</span><span class="plain">=1, </span><span class="identifier">memb</span><span class="plain">=</span><span class="identifier">o</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">=0: </span><span class="identifier">cl</span><span class="plain"><=</span><span class="identifier">no_classes</span><span class="plain">: </span><span class="identifier">cl</span><span class="plain">++) {</span>
|
|
<span class="comment">! Advance to first member of class number cl</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">partition_classes</span><span class="plain">-></span><span class="identifier">k</span><span class="plain"> ~= </span><span class="identifier">cl</span><span class="plain">) {</span>
|
|
<span class="identifier">k</span><span class="plain">++; </span><span class="identifier">memb</span><span class="plain"> = </span><span class="identifier">c_iterator</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">, </span><span class="identifier">ADVANCE_ITF</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">memb</span><span class="plain">) { </span><span class="comment">! In case of accidents, but should always happen</span>
|
|
<span class="identifier">lt</span><span class="plain"> = </span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">, </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">) ~= </span><span class="constant">0</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">, </span><span class="identifier">current_lt</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)) {</span>
|
|
<span class="identifier">no_groups</span><span class="plain">--;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">current_lt</span><span class="plain"> = </span><span class="identifier">lt</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">DBLW</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"[There are "</span><span class="plain">, </span><span class="identifier">no_groups</span><span class="plain">, </span><span class="string">" groups.]^"</span><span class="plain">; #</span><span class="identifier">Endif</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">no_groups</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">LT_Compare</span><span class="plain"> </span><span class="identifier">lt1</span><span class="plain"> </span><span class="identifier">lt2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt1</span><span class="plain"> == </span><span class="identifier">lt2</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">lt1</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">lt1</span><span class="plain"> = </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lt2</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">lt2</span><span class="plain"> = </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TEXT_TY_IsSubstituted</span><span class="plain">(</span><span class="identifier">lt1</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">TEXT_TY_IsSubstituted</span><span class="plain">(</span><span class="identifier">lt2</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="identifier">lt1</span><span class="plain">-->1)-(</span><span class="identifier">lt2</span><span class="plain">-->1);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">-1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TEXT_TY_IsSubstituted</span><span class="plain">(</span><span class="identifier">lt2</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">-1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">BlkValueCompare</span><span class="plain">(</span><span class="identifier">lt1</span><span class="plain">, </span><span class="identifier">lt2</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. Write List Recursively. </b>The big one: <code class="display"><span class="extract">WriteListR</span></code> is the heart of the list-writer.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">WriteListR</span><span class="plain"> </span><span class="identifier">o</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain"> </span><span class="identifier">from_start</span>
|
|
<span class="identifier">partition_classes</span><span class="plain"> </span><span class="identifier">partition_class_sizes</span>
|
|
<span class="identifier">cl</span><span class="plain"> </span><span class="identifier">memb</span><span class="plain"> </span><span class="identifier">index</span><span class="plain"> </span><span class="identifier">k2</span><span class="plain"> </span><span class="identifier">l</span><span class="plain"> </span><span class="identifier">m</span><span class="plain"> </span><span class="identifier">no_classes</span><span class="plain"> </span><span class="identifier">q</span><span class="plain"> </span><span class="identifier">groups_to_do</span><span class="plain"> </span><span class="identifier">current_lt</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">; </span><span class="comment">! An empty list: no output</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from_start</span><span class="plain">) {</span>
|
|
<span class="identifier">o</span><span class="plain"> = </span><span class="identifier">c_iterator</span><span class="plain">(</span><span class="identifier">o</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">COALESCE_ITF</span><span class="plain">); </span><span class="comment">! Coalesce list and choose new start</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">o</span><span class="plain"> = </span><span class="identifier">c_iterator</span><span class="plain">(</span><span class="identifier">o</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">SEEK_ITF</span><span class="plain">); </span><span class="comment">! Find first entry in list from o</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
|
|
<span class="comment">! Count index = length of list</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">memb</span><span class="plain">=</span><span class="identifier">o</span><span class="plain">, </span><span class="identifier">index</span><span class="plain">=0: </span><span class="identifier">memb</span><span class="plain">: </span><span class="identifier">memb</span><span class="plain">=</span><span class="identifier">c_iterator</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">, </span><span class="identifier">ADVANCE_ITF</span><span class="plain">)) </span><span class="identifier">index</span><span class="plain">++;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">ISARE_BIT</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">SetLWI</span><span class="plain">(</span><span class="identifier">index</span><span class="plain">, </span><span class="constant">-1</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'V'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">NEWLINE_BIT</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">":^"</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="identifier">char</span><span class="plain">) </span><span class="character">' '</span><span class="plain">;</span>
|
|
<span class="identifier">c_style</span><span class="plain"> = </span><span class="identifier">c_style</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">ISARE_BIT</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">partition_classes</span><span class="plain"> = </span><span class="identifier">RequisitionStack</span><span class="plain">(</span><span class="identifier">index</span><span class="plain">/</span><span class="identifier">WORDSIZE</span><span class="plain"> + </span><span class="constant">2</span><span class="plain">);</span>
|
|
<span class="identifier">partition_class_sizes</span><span class="plain"> = </span><span class="identifier">RequisitionStack</span><span class="plain">(</span><span class="identifier">index</span><span class="plain">/</span><span class="identifier">WORDSIZE</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">partition_classes</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">partition_class_sizes</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_LISTWRITERMEMORY</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">no_classes</span><span class="plain"> =</span>
|
|
<span class="identifier">PartitionList</span><span class="plain">(</span><span class="identifier">o</span><span class="plain">, </span><span class="identifier">index</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">partition_classes</span><span class="plain">, </span><span class="identifier">partition_class_sizes</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">groups_to_do</span><span class="plain"> =</span>
|
|
<span class="identifier">NumberOfGroupsInList</span><span class="plain">(</span><span class="identifier">o</span><span class="plain">, </span><span class="identifier">no_classes</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">partition_classes</span><span class="plain">, </span><span class="identifier">partition_class_sizes</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">cl</span><span class="plain">=1, </span><span class="identifier">memb</span><span class="plain">=</span><span class="identifier">o</span><span class="plain">, </span><span class="identifier">index</span><span class="plain">=0, </span><span class="identifier">current_lt</span><span class="plain">=</span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">: </span><span class="identifier">groups_to_do</span><span class="plain">>0: </span><span class="identifier">cl</span><span class="plain">++) {</span>
|
|
<span class="comment">! Set memb to first object of partition class cl</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">partition_classes</span><span class="plain">-></span><span class="identifier">index</span><span class="plain"> ~= </span><span class="identifier">cl</span><span class="plain">) {</span>
|
|
<span class="identifier">index</span><span class="plain">++; </span><span class="identifier">memb</span><span class="plain">=</span><span class="identifier">c_iterator</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">, </span><span class="identifier">ADVANCE_ITF</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">memb</span><span class="plain">==0) { </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"*** Error in list-writer ***^"</span><span class="plain">; </span><span class="reserved">return</span><span class="plain">; }</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">DBLW</span><span class="plain">;</span>
|
|
<span class="comment">! DebugPartition(partition_class_sizes, partition_classes, o, depth);</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^[Class "</span><span class="plain">, </span><span class="identifier">cl</span><span class="plain">, </span><span class="string">" of "</span><span class="plain">, </span><span class="identifier">no_classes</span><span class="plain">, </span><span class="string">": first object "</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">,</span>
|
|
<span class="string">" ("</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="string">"); groups_to_do "</span><span class="plain">, </span><span class="identifier">groups_to_do</span><span class="plain">, </span><span class="string">",</span>
|
|
<span class="identifier">current_lt</span><span class="plain">=</span><span class="string">", current_lt, "</span><span class="plain"> </span><span class="identifier">listing_size</span><span class="plain">=</span><span class="string">", listing_size,</span>
|
|
<span class="string">" lt_value="</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">, </span><span class="string">" memb.list_together="</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="string">"]^"</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">Endif</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)) </span><span class="identifier">current_lt</span><span class="plain"> = </span><span class="identifier">EMPTY_TEXT_VALUE</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">LT_Compare</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">current_lt</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
|
|
<span class="comment">! Otherwise this class begins a new group</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">listing_size</span><span class="plain">;</span>
|
|
<span class="identifier">q</span><span class="plain"> = </span><span class="identifier">memb</span><span class="plain">; </span><span class="identifier">listing_size</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">index</span><span class="plain">; </span><span class="identifier">m</span><span class="plain"> = </span><span class="identifier">cl</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">m</span><span class="plain"> < </span><span class="identifier">no_classes</span><span class="plain"> &&</span>
|
|
<span class="plain">(</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)) {</span>
|
|
<span class="identifier">m</span><span class="plain">++;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">partition_classes</span><span class="plain">-></span><span class="identifier">l</span><span class="plain"> ~= </span><span class="identifier">m</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">++; </span><span class="identifier">q</span><span class="plain"> = </span><span class="identifier">c_iterator</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">, </span><span class="identifier">ADVANCE_ITF</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="identifier">listing_size</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">listing_size</span><span class="plain"> > </span><span class="constant">1</span><span class="plain">) {</span>
|
|
<span class="comment">! The new group contains more than one partition class</span>
|
|
<span class="identifier">WriteMultiClassGroup</span><span class="plain">(</span><span class="identifier">cl</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">partition_class_sizes</span><span class="plain">);</span>
|
|
<span class="identifier">current_lt</span><span class="plain"> = </span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">;</span>
|
|
<span class="reserved">jump</span><span class="plain"> </span><span class="identifier">GroupComplete</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">current_lt</span><span class="plain"> = </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">listing_size</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">WriteSingleClassGroup</span><span class="plain">(</span><span class="identifier">cl</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="identifier">partition_class_sizes</span><span class="plain">-></span><span class="identifier">cl</span><span class="plain">);</span>
|
|
|
|
<span class="plain">.</span><span class="identifier">GroupComplete</span><span class="plain">;</span>
|
|
<span class="identifier">groups_to_do</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">ENGLISH_BIT</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">groups_to_do</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">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">cl</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="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="reserved">if</span><span class="plain"> (</span><span class="identifier">groups_to_do</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="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">FreeStack</span><span class="plain">(</span><span class="identifier">partition_class_sizes</span><span class="plain">);</span>
|
|
<span class="identifier">FreeStack</span><span class="plain">(</span><span class="identifier">partition_classes</span><span class="plain">);</span>
|
|
<span class="plain">]; </span><span class="comment">! end of WriteListR</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP21"></a><b>§21. Write Multiple Class Group. </b>The text of a single group which contains more than one partition class.
|
|
We carry out the "grouping together" activity, so that the user can add
|
|
text fore and aft — this is how groups of objects such as "X, Y and Z"
|
|
can be fluffed up to "the letters X, Y and Z from a Scrabble set" —
|
|
but the default is simple: we print the grouped items by calling
|
|
<code class="display"><span class="extract">WriteListR</span></code> once again, but this time starting from X, and where
|
|
<code class="display"><span class="extract">lt_value</span></code> is set to the common <code class="display"><span class="extract">list_together</span></code> value of X, Y and Z.
|
|
(That restricts the list to just the objects in this group.) Because
|
|
<code class="display"><span class="extract">lt_value</span></code> is set to this value, the grouping code won't then group X, Y
|
|
and Z again, and they will instead be individual classes in the new
|
|
list — so each will end up being sent, in turn, to <code class="display"><span class="extract">WriteSingleClassGroup</span></code>
|
|
below, and that is where they are printed.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">WriteMultiClassGroup</span><span class="plain"> </span><span class="identifier">cl</span><span class="plain"> </span><span class="identifier">memb</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain"> </span><span class="identifier">partition_class_sizes</span><span class="plain"> </span><span class="identifier">pv</span><span class="plain"> </span><span class="identifier">q</span><span class="plain"> </span><span class="identifier">k2</span><span class="plain"> </span><span class="identifier">l</span><span class="plain">;</span>
|
|
<span class="comment">! Save the style, because the activity below is allowed to change it</span>
|
|
<span class="identifier">q</span><span class="plain"> = </span><span class="identifier">c_style</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">INDENT_BIT</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">PrintSpaces</span><span class="plain">(2*(</span><span class="identifier">depth</span><span class="plain">+</span><span class="identifier">c_margin</span><span class="plain">));</span>
|
|
|
|
<span class="identifier">BeginActivity</span><span class="plain">(</span><span class="identifier">GROUPING_TOGETHER_ACT</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ForActivity</span><span class="plain">(</span><span class="identifier">GROUPING_TOGETHER_ACT</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">)) {</span>
|
|
<span class="identifier">c_style</span><span class="plain"> = </span><span class="identifier">c_style</span><span class="plain"> &~ </span><span class="identifier">NEWLINE_BIT</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">pv</span><span class="plain"> = </span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TEXT_TY_IsSubstituted</span><span class="plain">(</span><span class="identifier">pv</span><span class="plain">) == </span><span class="reserved">false</span><span class="plain">) {</span>
|
|
<span class="identifier">inventory_stage</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="identifier">parser_one</span><span class="plain"> = </span><span class="identifier">memb</span><span class="plain">; </span><span class="identifier">parser_two</span><span class="plain"> = </span><span class="identifier">depth</span><span class="plain"> + </span><span class="identifier">c_margin</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pv</span><span class="plain">-->1)() == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">jump</span><span class="plain"> </span><span class="identifier">Omit__Sublist2</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">pv</span><span class="plain">) {</span>
|
|
<span class="comment">! Set k2 to the number of objects covered by the group</span>
|
|
<span class="identifier">k2</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">l</span><span class="plain">=0 : </span><span class="identifier">l</span><span class="plain"><</span><span class="identifier">listing_size</span><span class="plain"> : </span><span class="identifier">l</span><span class="plain">++) </span><span class="identifier">k2</span><span class="plain"> = </span><span class="identifier">k2</span><span class="plain"> + </span><span class="identifier">partition_class_sizes</span><span class="plain">->(</span><span class="identifier">l</span><span class="plain">+</span><span class="identifier">cl</span><span class="plain">);</span>
|
|
<span class="identifier">EnglishNumber</span><span class="plain">(</span><span class="identifier">k2</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">print</span><span class="plain"> (</span><span class="identifier">TEXT_TY_Say</span><span class="plain">) </span><span class="identifier">pv</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">ENGLISH_BIT</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">" ("</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">INDENT_BIT</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">":^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">c_margin</span><span class="plain">++;</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">lt_value</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">listing_together</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">listing_size</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">lt_value</span><span class="plain"> = </span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">; </span><span class="identifier">listing_together</span><span class="plain"> = </span><span class="identifier">memb</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">DBLW</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"^^DOWN lt_value = "</span><span class="plain">, </span><span class="identifier">lt_value</span><span class="plain">, </span><span class="string">" listing_together = "</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">, </span><span class="string">"^^"</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">DBLW_no_classes</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">DBLW_no_objs</span><span class="plain">; #</span><span class="identifier">Endif</span><span class="plain">;</span>
|
|
<span class="identifier">WriteListR</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">, </span><span class="reserved">false</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">DBLW</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"^^UP^^"</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">DBLW_no_objs</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">DBLW_no_classes</span><span class="plain">; #</span><span class="identifier">Endif</span><span class="plain">;</span>
|
|
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">listing_size</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">listing_together</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">lt_value</span><span class="plain">;</span>
|
|
<span class="identifier">c_margin</span><span class="plain">--;</span>
|
|
|
|
<span class="identifier">pv</span><span class="plain"> = </span><span class="identifier">memb</span><span class="plain">.</span><span class="identifier">list_together</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TEXT_TY_IsSubstituted</span><span class="plain">(</span><span class="identifier">pv</span><span class="plain">) == </span><span class="reserved">false</span><span class="plain">) {</span>
|
|
<span class="identifier">inventory_stage</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
|
|
<span class="identifier">parser_one</span><span class="plain"> = </span><span class="identifier">memb</span><span class="plain">; </span><span class="identifier">parser_two</span><span class="plain"> = </span><span class="identifier">depth</span><span class="plain">+</span><span class="identifier">c_margin</span><span class="plain">;</span>
|
|
<span class="plain">(</span><span class="identifier">pv</span><span class="plain">-->1)();</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LT_Compare</span><span class="plain">(</span><span class="identifier">pv</span><span class="plain">, </span><span class="identifier">EMPTY_TEXT_VALUE</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">q</span><span class="plain"> & </span><span class="identifier">ENGLISH_BIT</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">")"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">.</span><span class="identifier">Omit__Sublist2</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">EndActivity</span><span class="plain">(</span><span class="identifier">GROUPING_TOGETHER_ACT</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">);</span>
|
|
|
|
<span class="comment">! If the NEWLINE_BIT has been forced by the activity, act now</span>
|
|
<span class="comment">! before it vanishes...</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">q</span><span class="plain"> & </span><span class="identifier">NEWLINE_BIT</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain"> && </span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">NEWLINE_BIT</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">new_line</span><span class="plain">;</span>
|
|
|
|
<span class="comment">! ...when the original style is restored again:</span>
|
|
<span class="identifier">c_style</span><span class="plain"> = </span><span class="identifier">q</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. Write Single Class Group. </b>The text of a single group which contains exactly one partition class.
|
|
Because of the way the multiple-class case recurses, every class ends up
|
|
in this routine sooner or later; this is the place where the actual
|
|
name of an object is printed, at long last.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">WriteSingleClassGroup</span><span class="plain"> </span><span class="identifier">cl</span><span class="plain"> </span><span class="identifier">memb</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain"> </span><span class="identifier">size</span><span class="plain"> </span><span class="identifier">q</span><span class="plain">;</span>
|
|
<span class="identifier">q</span><span class="plain"> = </span><span class="identifier">c_style</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">INDENT_BIT</span><span class="plain">) </span><span class="identifier">PrintSpaces</span><span class="plain">(2*(</span><span class="identifier">depth</span><span class="plain">+</span><span class="identifier">c_margin</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">size</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">c_style</span><span class="plain"> & </span><span class="identifier">NOARTICLE_BIT</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="identifier">name</span><span class="plain">) </span><span class="identifier">memb</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">c_style</span><span class="plain"> & </span><span class="identifier">DEFART_BIT</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">cl</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) && (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">CFIRSTART_BIT</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">memb</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="identifier">the</span><span class="plain">) </span><span class="identifier">memb</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">cl</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) && (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">CFIRSTART_BIT</span><span class="plain">)) </span><span class="reserved">print</span><span class="plain"> (</span><span class="identifier">CIndefArt</span><span class="plain">) </span><span class="identifier">memb</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="identifier">a</span><span class="plain">) </span><span class="identifier">memb</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">DEFART_BIT</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">cl</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) && (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">CFIRSTART_BIT</span><span class="plain">)) </span><span class="identifier">PrefaceByArticle</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">size</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PrefaceByArticle</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">size</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">listing_size</span><span class="plain">; </span><span class="identifier">listing_size</span><span class="plain"> = </span><span class="identifier">size</span><span class="plain">;</span>
|
|
<span class="identifier">CarryOutActivity</span><span class="plain">(</span><span class="identifier">PRINTING_A_NUMBER_OF_ACT</span><span class="plain">, </span><span class="identifier">memb</span><span class="plain">);</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">listing_size</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">size</span><span class="plain"> > </span><span class="constant">1</span><span class="plain">) && (</span><span class="identifier">memb</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">pluralname</span><span class="plain">)) {</span>
|
|
<span class="reserved">give</span><span class="plain"> </span><span class="identifier">memb</span><span class="plain"> </span><span class="identifier">pluralname</span><span class="plain">;</span>
|
|
<span class="identifier">WriteAfterEntry</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">);</span>
|
|
<span class="reserved">give</span><span class="plain"> </span><span class="identifier">memb</span><span class="plain"> ~</span><span class="identifier">pluralname</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">WriteAfterEntry</span><span class="plain">(</span><span class="identifier">memb</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">);</span>
|
|
<span class="identifier">c_style</span><span class="plain"> = </span><span class="identifier">q</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. Write After Entry. </b>Each entry can be followed by supplementary, usually parenthetical, information:
|
|
exactly what, depends on the style. The extreme case is when the style, and
|
|
the object, call for recursion to list the object-tree contents: this is
|
|
achieved by calling <code class="display"><span class="extract">WriteListR</span></code>, using the <code class="display"><span class="extract">ObjectTreeIterator</span></code> (whatever
|
|
the iterator used at the top level) and increasing the depth by 1.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">WriteAfterEntry</span><span class="plain"> </span><span class="identifier">o</span><span class="plain"> </span><span class="identifier">depth</span>
|
|
<span class="identifier">p</span><span class="plain"> </span><span class="identifier">recurse_flag</span><span class="plain"> </span><span class="identifier">parenth_flag</span><span class="plain"> </span><span class="identifier">eldest_child</span><span class="plain"> </span><span class="identifier">child_count</span><span class="plain"> </span><span class="identifier">combo</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">inventory_stage</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">c_style</span><span class="plain"> & </span><span class="identifier">PARTINV_BIT</span><span class="plain">) {</span>
|
|
<span class="identifier">BeginActivity</span><span class="plain">(</span><span class="identifier">PRINTING_ROOM_DESC_DETAILS_ACT</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ForActivity</span><span class="plain">(</span><span class="identifier">PRINTING_ROOM_DESC_DETAILS_ACT</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">) == </span><span class="reserved">false</span><span class="plain">) {</span>
|
|
<span class="identifier">combo</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">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">light</span><span class="plain"> && </span><span class="identifier">location</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">light</span><span class="plain">) </span><span class="identifier">combo</span><span class="plain">=</span><span class="identifier">combo</span><span class="plain">+1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">container</span><span class="plain"> && </span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">hasnt</span><span class="plain"> </span><span class="identifier">open</span><span class="plain">) </span><span class="identifier">combo</span><span class="plain">=</span><span class="identifier">combo</span><span class="plain">+2;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">container</span><span class="plain"> && (</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">open</span><span class="plain"> || </span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">transparent</span><span class="plain">))</span>
|
|
<span class="plain">&& (</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">o</span><span class="plain">)==0)) </span><span class="identifier">combo</span><span class="plain">=</span><span class="identifier">combo</span><span class="plain">+4;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">combo</span><span class="plain">) </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="comment">! space and open bracket</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">combo</span><span class="plain">) {</span>
|
|
<span class="constant">1</span><span class="plain">: </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'D'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="constant">2</span><span class="plain">: </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'E'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="constant">3</span><span class="plain">: </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'H'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="constant">4</span><span class="plain">: </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'F'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="constant">5</span><span class="plain">: </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'I'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="constant">6</span><span class="plain">: </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'G'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="constant">7</span><span class="plain">: </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'J'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">combo</span><span class="plain">) </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">); </span><span class="comment">! close bracket</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">EndActivity</span><span class="plain">(</span><span class="identifier">PRINTING_ROOM_DESC_DETAILS_ACT</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="comment">! end of PARTINV_BIT processing</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">FULLINV_BIT</span><span class="plain">) {</span>
|
|
<span class="identifier">BeginActivity</span><span class="plain">(</span><span class="identifier">PRINTING_INVENTORY_DETAILS_ACT</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ForActivity</span><span class="plain">(</span><span class="identifier">PRINTING_INVENTORY_DETAILS_ACT</span><span class="plain">, </span><span class="identifier">o</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">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">light</span><span class="plain"> && </span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">worn</span><span class="plain">) { </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'K'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">); </span><span class="identifier">parenth_flag</span><span class="plain"> = </span><span class="reserved">true</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">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">light</span><span class="plain">) { </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'D'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">); </span><span class="identifier">parenth_flag</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">worn</span><span class="plain">) { </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'L'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">); </span><span class="identifier">parenth_flag</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">; }</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">container</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">openable</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">parenth_flag</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">print</span><span class="plain"> </span><span class="string">","</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="reserved">else</span><span class="plain"> </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">open</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">o</span><span class="plain">)) </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'M'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'N'</span><span class="plain">, </span><span class="identifier">o</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">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">lockable</span><span class="plain"> && </span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">locked</span><span class="plain">) </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'P'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'O'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">parenth_flag</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">o</span><span class="plain">)==0 && </span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">transparent</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">parenth_flag</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="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'F'</span><span class="plain">); }</span>
|
|
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">); </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'F'</span><span class="plain">); </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'B'</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">parenth_flag</span><span class="plain">) </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">EndActivity</span><span class="plain">(</span><span class="identifier">PRINTING_INVENTORY_DETAILS_ACT</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="comment">! end of FULLINV_BIT processing</span>
|
|
|
|
<span class="identifier">child_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">eldest_child</span><span class="plain"> = </span><span class="reserved">nothing</span><span class="plain">;</span>
|
|
<span class="reserved">objectloop</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> </span><span class="reserved">in</span><span class="plain"> </span><span class="identifier">o</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">CONCEAL_BIT</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">ConcealedFromLists</span><span class="plain">(</span><span class="identifier">p</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">p</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">list_filter_permits</span><span class="plain">) {</span>
|
|
<span class="identifier">child_count</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eldest_child</span><span class="plain"> == </span><span class="reserved">nothing</span><span class="plain">) </span><span class="identifier">eldest_child</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">child_count</span><span class="plain"> && (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">ALWAYS_BIT</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">ENGLISH_BIT</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_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'Q'</span><span class="plain">, </span><span class="identifier">o</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">recurse_flag</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">child_count</span><span class="plain"> && (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">RECURSE_BIT</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">supporter</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">ENGLISH_BIT</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">TERSE_BIT</span><span class="plain">) {</span>
|
|
<span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'R'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'S'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">recurse_flag</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">container</span><span class="plain"> && (</span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">open</span><span class="plain"> || </span><span class="identifier">o</span><span class="plain"> </span><span class="reserved">has</span><span class="plain"> </span><span class="identifier">transparent</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">ENGLISH_BIT</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">TERSE_BIT</span><span class="plain">) {</span>
|
|
<span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'A'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'T'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'U'</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">recurse_flag</span><span class="plain"> = </span><span class="reserved">true</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">recurse_flag</span><span class="plain"> && (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">ENGLISH_BIT</span><span class="plain">)) {</span>
|
|
<span class="identifier">SetLWI</span><span class="plain">(</span><span class="identifier">child_count</span><span class="plain">, </span><span class="constant">-1</span><span class="plain">, </span><span class="identifier">eldest_child</span><span class="plain">);</span>
|
|
<span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'V'</span><span class="plain">, </span><span class="identifier">o</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">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">NEWLINE_BIT</span><span class="plain">) </span><span class="reserved">new_line</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">recurse_flag</span><span class="plain">) {</span>
|
|
<span class="identifier">o</span><span class="plain"> = </span><span class="reserved">child</span><span class="plain">(</span><span class="identifier">o</span><span class="plain">);</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">lt_value</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">listing_together</span><span class="plain">; @</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">listing_size</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">c_iterator</span><span class="plain">;</span>
|
|
<span class="identifier">c_iterator</span><span class="plain"> = </span><span class="identifier">ObjectTreeIterator</span><span class="plain">;</span>
|
|
<span class="identifier">lt_value</span><span class="plain"> = </span><span class="identifier">EMPTY_TEXT_VALUE</span><span class="plain">; </span><span class="identifier">listing_together</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">listing_size</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">WriteListR</span><span class="plain">(</span><span class="identifier">o</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">+1, </span><span class="reserved">true</span><span class="plain">);</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">c_iterator</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">listing_size</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">listing_together</span><span class="plain">; @</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">lt_value</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_style</span><span class="plain"> & </span><span class="identifier">TERSE_BIT</span><span class="plain">) </span><span class="identifier">LIST_WRITER_INTERNAL_RM</span><span class="plain">(</span><span class="character">'B'</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP24"></a><b>§24. Internal Rule. </b>This rule does nothing in itself; it exists as a placeholder for the
|
|
response texts used by the list-writer.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">LIST_WRITER_INTERNAL_R</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="S-lt.html">Back to 'Light Template'</a></li><li><a href="S-ot2.html">Continue with 'OrderOfPlay Template'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|