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

Improvements to how extensions can create kinds

This commit is contained in:
Graham Nelson 2024-04-24 23:01:07 +01:00
parent 623fbb916e
commit ec38eb8d2f
94 changed files with 1884 additions and 402 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
[Version](notes/versioning.md): 10.2.0-beta+6X46 'Krypton' (22 April 2024)
[Version](notes/versioning.md): 10.2.0-beta+6X47 'Krypton' (24 April 2024)
## About Inform

View file

@ -1,3 +1,3 @@
Prerelease: beta
Build Date: 22 April 2024
Build Number: 6X46
Build Date: 24 April 2024
Build Number: 6X47

View file

@ -160,16 +160,20 @@ the long block.
</li></ul>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP</span><span class="plain-syntax"> = </span><span class="constant-syntax">$ff</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVUSERBITMAP</span><span class="plain-syntax"> = </span><span class="constant-syntax">$0f</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_LONGBLOCK</span><span class="plain-syntax"> = </span><span class="constant-syntax">$10</span><span class="plain-syntax">; </span><span class="comment-syntax">Word 1 of SB is pointer to LB</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_TEXT</span><span class="plain-syntax"> = </span><span class="constant-syntax">$20</span><span class="plain-syntax">; </span><span class="comment-syntax">BV holds a TEXT_TY value</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_CONSTANT</span><span class="plain-syntax"> = </span><span class="constant-syntax">$40</span><span class="plain-syntax">; </span><span class="comment-syntax">BV holds a TEXT_TY value</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_CONSTANT</span><span class="plain-syntax"> = </span><span class="constant-syntax">$40</span><span class="plain-syntax">; </span><span class="comment-syntax">BV holds a constant value</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_SBONLY</span><span class="plain-syntax"> = </span><span class="constant-syntax">$80</span><span class="plain-syntax">; </span><span class="comment-syntax">No LB, and kind ID is in word 1 of SB</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">IFTRUE</span><span class="plain-syntax"> </span><span class="identifier-syntax">WORDSIZE</span><span class="plain-syntax"> == </span><span class="constant-syntax">4</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_USERBITMAPMASK</span><span class="plain-syntax"> = </span><span class="constant-syntax">$fffffff0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_LONGBLOCKMASK</span><span class="plain-syntax"> = </span><span class="constant-syntax">$ffffff10</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_TEXTMASK</span><span class="plain-syntax"> = </span><span class="constant-syntax">$ffffff20</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_CONSTANTMASK</span><span class="plain-syntax"> = </span><span class="constant-syntax">$ffffff40</span><span class="plain-syntax">;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">IFNOT</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_USERBITMAPMASK</span><span class="plain-syntax"> = </span><span class="constant-syntax">$fff0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_LONGBLOCKMASK</span><span class="plain-syntax"> = </span><span class="constant-syntax">$ff10</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_TEXTMASK</span><span class="plain-syntax"> = </span><span class="constant-syntax">$ff20</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">BLK_BVBITMAP_CONSTANTMASK</span><span class="plain-syntax"> = </span><span class="constant-syntax">$ff40</span><span class="plain-syntax">;</span>
@ -204,6 +208,7 @@ which have no long block: we must use the bitmap instead.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">o</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax">--&gt;(</span><span class="identifier-syntax">BLK_HEADER_KOV</span><span class="plain-syntax">+1);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">o</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">BLK_BVBITMAP</span><span class="plain-syntax"> == </span><span class="identifier-syntax">o</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">o</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">BLK_BVBITMAP_TEXT</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEXT_TY</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">o</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">BLK_BVBITMAP_SBONLY</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">KindWeakID</span><span class="plain-syntax">(</span><span class="identifier-syntax">bv</span><span class="plain-syntax">--&gt;1);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">o</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bv</span><span class="plain-syntax">--&gt;1;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">o</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">BLK_HEADER_KOV</span><span class="plain-syntax">;</span>
@ -249,11 +254,12 @@ go downwards that we have to worry about whether something happens.
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">refc</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">bv</span><span class="plain-syntax">--&gt;0) &amp; </span><span class="identifier-syntax">BLK_BVBITMAP_SBONLY</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">RC_INFINITY</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Long Block Capacity. </b>As we've seen, the long block has some metadata in a header, but otherwise
it's organised as if it were an array, with entries 8, 16 or 32 bits wide.
it's organised as if it were an array, with byte or word-sized entries.
At any given time, the "capacity" of the LB is the number of entries in
this array: that doesn't mean that the BV is using them all at any given moment.
</p>
@ -764,8 +770,9 @@ here's where.
<span class="plain-syntax"> </span><span class="identifier-syntax">from_long_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueGetLongBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_bv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">from_long_block</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">recycling</span><span class="plain-syntax">) </span><span class="identifier-syntax">BlkValueRecyclePrimitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_bv</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">extent_fn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ReadKindMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">LONG_BLOCK_SIZE_FN_KMF</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">extent_fn</span><span class="plain-syntax">) </span><span class="identifier-syntax">no_entries_to_copy</span><span class="plain-syntax"> = </span><span class="identifier-syntax">extent_fn</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_bv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">extent_fn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ReadKindMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">LONG_BLOCK_SIZE_KMF</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">extent_fn</span><span class="plain-syntax"> </span><span class="reserved-syntax">ofclass</span><span class="plain-syntax"> </span><span class="identifier-syntax">Routine</span><span class="plain-syntax">) </span><span class="identifier-syntax">no_entries_to_copy</span><span class="plain-syntax"> = </span><span class="identifier-syntax">extent_fn</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_bv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">extent_fn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">no_entries_to_copy</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">no_entries_to_copy</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">no_entries_to_copy</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueLBCapacity</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_bv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BlkValueMassCopyEntries</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_bv</span><span class="plain-syntax">, </span><span class="identifier-syntax">from_bv</span><span class="plain-syntax">, </span><span class="identifier-syntax">no_entries_to_copy</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
@ -785,7 +792,6 @@ otherwise we go ahead and make one.
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">LKTRACE_HEAP</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"Copy: "</span><span class="plain-syntax">, (</span><span class="identifier-syntax">BlkValueDebug</span><span class="plain-syntax">) </span><span class="identifier-syntax">to_bv</span><span class="plain-syntax">, </span><span class="string-syntax">" to equal "</span><span class="plain-syntax">, (</span><span class="identifier-syntax">BlkValueDebug</span><span class="plain-syntax">) </span><span class="identifier-syntax">from_bv</span><span class="plain-syntax">, </span><span class="string-syntax">"^"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueWeakKind</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_bv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">from_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueWeakKind</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_bv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">to_kind</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">from_kind</span><span class="plain-syntax">) </span><span class="identifier-syntax">BlkValueError</span><span class="plain-syntax">(</span><span class="string-syntax">"copy incompatible kinds"</span><span class="plain-syntax">);</span>
@ -793,6 +799,8 @@ otherwise we go ahead and make one.
<span class="plain-syntax"> </span><span class="identifier-syntax">quick_copy_fn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ReadKindMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">QUICK_COPY_FN_KMF</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">quick_copy_fn</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">quick_copy_fn</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_bv</span><span class="plain-syntax">, </span><span class="identifier-syntax">from_bv</span><span class="plain-syntax">) == </span><span class="reserved-syntax">false</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BlkValueSlowCopyPrimitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_bv</span><span class="plain-syntax">, </span><span class="identifier-syntax">from_bv</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_kind</span><span class="plain-syntax">, </span><span class="reserved-syntax">true</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">to_bv</span><span class="plain-syntax">--&gt;0 &amp; </span><span class="identifier-syntax">BLK_BVBITMAP_SBONLY</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BlkValueSlowCopyPrimitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_bv</span><span class="plain-syntax">, </span><span class="identifier-syntax">from_bv</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_kind</span><span class="plain-syntax">, </span><span class="reserved-syntax">true</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BlkValueQuickCopyPrimitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_bv</span><span class="plain-syntax">, </span><span class="identifier-syntax">from_bv</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_kind</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">to_bv</span><span class="plain-syntax">;</span>
@ -943,7 +951,7 @@ work first time, so it turned out to be useful to have these routines on hand.
<span class="plain-syntax"> </span><span class="identifier-syntax">refc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueGetRefCountPrimitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">bv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">refc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">RC_INFINITY</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">" resident"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> { </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">" "</span><span class="plain-syntax">, </span><span class="identifier-syntax">refc</span><span class="plain-syntax">, </span><span class="string-syntax">" ref"</span><span class="plain-syntax">; </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">refc</span><span class="plain-syntax"> ~= </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"s"</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">bv</span><span class="plain-syntax">--&gt;0) &amp; </span><span class="identifier-syntax">BLK_BVBITMAP_SBONLY</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"SBO"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">" = "</span><span class="plain-syntax">; </span><span class="identifier-syntax">SayKindValuePair</span><span class="plain-syntax">(</span><span class="identifier-syntax">BlkValueWeakKind</span><span class="plain-syntax">(</span><span class="identifier-syntax">bv</span><span class="plain-syntax">), </span><span class="identifier-syntax">bv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">BlkValueWeakKind</span><span class="plain-syntax">(</span><span class="identifier-syntax">bv</span><span class="plain-syntax">) == </span><span class="identifier-syntax">TEXT_TY</span><span class="plain-syntax">) </span><span class="identifier-syntax">TEXT_TY_Debug</span><span class="plain-syntax">(</span><span class="identifier-syntax">bv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>

View file

@ -95,7 +95,7 @@ Thus, a triple \((x, y, z)\) uses 4 words.
<span class="plain-syntax">[ </span><span class="identifier-syntax">COMBINATION_TY_Create</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> </span><span class="identifier-syntax">sb_address</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> </span><span class="identifier-syntax">bk</span><span class="plain-syntax"> </span><span class="identifier-syntax">v</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindConstructorArity</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVLongBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMBINATION_ITEM_BASE</span><span class="plain-syntax">+</span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="identifier-syntax">COMBINATION_TY</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVLongBlockFlexible</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMBINATION_TY</span><span class="plain-syntax">, </span><span class="identifier-syntax">COMBINATION_ITEM_BASE</span><span class="plain-syntax"> + </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">COMBINATION_KIND_F</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">=0: </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">N</span><span class="plain-syntax">: </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bk</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindConstructorTerm</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
@ -104,7 +104,7 @@ Thus, a triple \((x, y, z)\) uses 4 words.
<span class="plain-syntax"> </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">COMBINATION_ITEM_BASE</span><span class="plain-syntax">+</span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">v</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">sb_address</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">sb_address</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">--&gt;0 = </span><span class="identifier-syntax">long_block</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">;</span>

View file

@ -137,7 +137,7 @@ does not conform to <span class="extract"><span class="extract-syntax">POINTER_V
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">MAKE_MUTABLE_FN_KMF</span><span class="plain-syntax"> = </span><span class="constant-syntax">13</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">HASH_FN_KMF</span><span class="plain-syntax"> = </span><span class="constant-syntax">14</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">SHORT_BLOCK_SIZE_KMF</span><span class="plain-syntax"> = </span><span class="constant-syntax">15</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">LONG_BLOCK_SIZE_FN_KMF</span><span class="plain-syntax"> = </span><span class="constant-syntax">16</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">LONG_BLOCK_SIZE_KMF</span><span class="plain-syntax"> = </span><span class="constant-syntax">16</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">SERIALISE_FN_KMF</span><span class="plain-syntax"> = </span><span class="constant-syntax">17</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">UNSERIALISE_FN_KMF</span><span class="plain-syntax"> = </span><span class="constant-syntax">18</span><span class="plain-syntax">;</span>
</pre>
@ -359,12 +359,52 @@ values of kinds conforming to POINTER_VALUE_TY.
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">PVField</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueReadSB</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">WritePVField</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueWriteSB</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">CreatePVLongBlock</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueCreateLB</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">CreatePVLongBlockMultiple</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueCreateMultipleLB</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueWriteLB</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">PVLongBlockField</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueReadLB</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueCreateSB</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">SBONLYPV_FIELDS</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax"> </span><span class="identifier-syntax">sb_address</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_id</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ReadKindMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">SHORT_BLOCK_SIZE_KMF</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueCreateSB</span><span class="plain-syntax">(</span><span class="identifier-syntax">sb_address</span><span class="plain-syntax">, </span><span class="identifier-syntax">size</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ReadKindMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">LONG_BLOCK_SIZE_KMF</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">--&gt;0 = </span><span class="identifier-syntax">BLK_BVBITMAP_SBONLY</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">--&gt;1 = </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">CreatePVLongBlock</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">size</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ReadKindMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">LONG_BLOCK_SIZE_KMF</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">size</span><span class="plain-syntax"> </span><span class="reserved-syntax">ofclass</span><span class="plain-syntax"> </span><span class="identifier-syntax">Routine</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BlkValueError</span><span class="plain-syntax">(</span><span class="string-syntax">"CreatePVLongBlock needs a size"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax"> = </span><span class="constant-syntax">8</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">BlkValueCreateLB</span><span class="plain-syntax">(</span><span class="identifier-syntax">size</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">CreatePVLongBlockFlexible</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">size</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BlkValueError</span><span class="plain-syntax">(</span><span class="string-syntax">"CreatePVLongBlockFlexible needs a size"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax"> = </span><span class="constant-syntax">8</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">BlkValueCreateMultipleLB</span><span class="plain-syntax">(</span><span class="identifier-syntax">size</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">KindOfShortBlockOnlyPV</span><span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax">--&gt;1;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">ShortBlockOnlyPVFlags</span><span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bv</span><span class="plain-syntax">--&gt;0) &amp; </span><span class="identifier-syntax">BLK_BVUSERBITMAP</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">WriteShortBlockOnlyPVFlags</span><span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax"> </span><span class="identifier-syntax">flags</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax">--&gt;0 = ((</span><span class="identifier-syntax">bv</span><span class="plain-syntax">--&gt;0) &amp; </span><span class="identifier-syntax">BLK_BVBITMAP_USERBITMAPMASK</span><span class="plain-syntax">) + (</span><span class="identifier-syntax">flags</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">BLK_BVUSERBITMAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">CopyPVShortBlock</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueCopySB</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">CopyPVRawData</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BlkValueCopyRawLongBlock</span><span class="plain-syntax">;</span>

View file

@ -88,12 +88,12 @@ list metadata entries below.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">LIST_OF_TY_Create</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax"> </span><span class="identifier-syntax">sb_address</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVLongBlockMultiple</span><span class="plain-syntax">(27, </span><span class="identifier-syntax">LIST_OF_TY</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVLongBlockFlexible</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">, </span><span class="constant-syntax">27</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">LIST_ITEM_KOV_F</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">KindConstructorTerm</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">LIST_LENGTH_F</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">sb_address</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">sb_address</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">--&gt;0 = </span><span class="identifier-syntax">long_block</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">;</span>

View file

@ -64,7 +64,7 @@ MathJax = {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">BasicInformKit</a></li><li><b>Relation Kind Template</b></li></ul></div>
<p class="purpose">Code to support the relation kind.</p>
<ul class="toc"><li><a href="S-rlt.html#SP1">&#167;1. Block Format</a></li><li><a href="S-rlt.html#SP2">&#167;2. Other Definitions</a></li><li><a href="S-rlt.html#SP3">&#167;3. Tunable Parameters</a></li><li><a href="S-rlt.html#SP4">&#167;4. Abstract Relations</a></li><li><a href="S-rlt.html#SP5">&#167;5. Empty Relations</a></li><li><a href="S-rlt.html#SP6">&#167;6. Creation</a></li><li><a href="S-rlt.html#SP7">&#167;7. Destruction</a></li><li><a href="S-rlt.html#SP8">&#167;8. Copying</a></li><li><a href="S-rlt.html#SP9">&#167;9. Comparison</a></li><li><a href="S-rlt.html#SP10">&#167;10. Printing</a></li><li><a href="S-rlt.html#SP11">&#167;11. Naming</a></li><li><a href="S-rlt.html#SP12">&#167;12. Choose Relation Handler</a></li><li><a href="S-rlt.html#SP13">&#167;13. Valency</a></li><li><a href="S-rlt.html#SP14">&#167;14. Double Hash Set Relation Handler</a></li><li><a href="S-rlt.html#SP15">&#167;15. Hash List Relation Handler</a></li><li><a href="S-rlt.html#SP16">&#167;16. Hash Table Relation Handler</a></li><li><a href="S-rlt.html#SP17">&#167;17. Reversed Hash Table Relation Handler</a></li><li><a href="S-rlt.html#SP18">&#167;18. Symmetric Relation Handlers</a></li><li><a href="S-rlt.html#SP19">&#167;19. Hash Core Relation Handler</a></li><li><a href="S-rlt.html#SP20">&#167;20. Equivalence Hash Table Relation Handler</a></li><li><a href="S-rlt.html#SP21">&#167;21. Two-In-One Hash Table Relation Handler</a></li><li><a href="S-rlt.html#SP22">&#167;22. Empty</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-rlt.html#SP1">&#167;1. Block Format</a></li><li><a href="S-rlt.html#SP2">&#167;2. Other Definitions</a></li><li><a href="S-rlt.html#SP3">&#167;3. Tunable Parameters</a></li><li><a href="S-rlt.html#SP4">&#167;4. Abstract Relations</a></li><li><a href="S-rlt.html#SP5">&#167;5. Empty Relations</a></li><li><a href="S-rlt.html#SP6">&#167;6. Creation</a></li><li><a href="S-rlt.html#SP7">&#167;7. Extent</a></li><li><a href="S-rlt.html#SP8">&#167;8. Destruction</a></li><li><a href="S-rlt.html#SP9">&#167;9. Copying</a></li><li><a href="S-rlt.html#SP10">&#167;10. Comparison</a></li><li><a href="S-rlt.html#SP11">&#167;11. Printing</a></li><li><a href="S-rlt.html#SP12">&#167;12. Naming</a></li><li><a href="S-rlt.html#SP13">&#167;13. Choose Relation Handler</a></li><li><a href="S-rlt.html#SP14">&#167;14. Valency</a></li><li><a href="S-rlt.html#SP15">&#167;15. Double Hash Set Relation Handler</a></li><li><a href="S-rlt.html#SP16">&#167;16. Hash List Relation Handler</a></li><li><a href="S-rlt.html#SP17">&#167;17. Hash Table Relation Handler</a></li><li><a href="S-rlt.html#SP18">&#167;18. Reversed Hash Table Relation Handler</a></li><li><a href="S-rlt.html#SP19">&#167;19. Symmetric Relation Handlers</a></li><li><a href="S-rlt.html#SP20">&#167;20. Hash Core Relation Handler</a></li><li><a href="S-rlt.html#SP21">&#167;21. Equivalence Hash Table Relation Handler</a></li><li><a href="S-rlt.html#SP22">&#167;22. Two-In-One Hash Table Relation Handler</a></li><li><a href="S-rlt.html#SP23">&#167;23. Empty</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Block Format. </b>Inform uses a rich variety of relations, with many different data representations,
but we aim to hide that complexity from the user. At run-time, a relation is
@ -267,7 +267,7 @@ newly constructed data structure which can grow freely from here.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">RELATION_TY_Create</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax"> </span><span class="identifier-syntax">sb_address</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> </span><span class="identifier-syntax">handler</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVLongBlockMultiple</span><span class="plain-syntax">(</span><span class="identifier-syntax">RRV_DATA_BASE</span><span class="plain-syntax"> + </span><span class="constant-syntax">3</span><span class="plain-syntax">*</span><span class="identifier-syntax">RRP_MIN_SIZE</span><span class="plain-syntax">, </span><span class="identifier-syntax">RELATION_TY</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVLongBlockFlexible</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">RRV_DATA_BASE</span><span class="plain-syntax"> + </span><span class="constant-syntax">3</span><span class="plain-syntax">*</span><span class="identifier-syntax">RRP_MIN_SIZE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">from</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">)) </span><span class="identifier-syntax">from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">DefaultValueFinder</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">=0: </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">RRV_DATA_BASE</span><span class="plain-syntax">: </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">PVField</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">));</span>
@ -295,13 +295,22 @@ newly constructed data structure which can grow freely from here.
<span class="plain-syntax"> </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">RRV_FILLED</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">sb_address</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">sb_address</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">--&gt;0 = </span><span class="identifier-syntax">long_block</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Destruction. </b>If the relation stores block values on either side, invoke the handler using a special task
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Extent. </b>We need to provide an explicit function for this, even though we only say the
answer is "use the capacity".
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">RELATION_TY_LongBlockSize</span><span class="plain-syntax"> </span><span class="identifier-syntax">rel</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Destruction. </b>If the relation stores block values on either side, invoke the handler using a special task
value to free the memory associated with them.
</p>
@ -311,7 +320,7 @@ value to free the memory associated with them.
<span class="plain-syntax"> </span><span class="identifier-syntax">handler</span><span class="plain-syntax">(</span><span class="identifier-syntax">rel</span><span class="plain-syntax">, </span><span class="identifier-syntax">RELS_DESTROY</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Copying. </b>Same as destruction: invoke the handler using a special value to tell it to perform
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Copying. </b>Same as destruction: invoke the handler using a special value to tell it to perform
deep copying.
</p>
@ -322,7 +331,7 @@ deep copying.
<span class="plain-syntax"> </span><span class="identifier-syntax">handler</span><span class="plain-syntax">(</span><span class="identifier-syntax">lto</span><span class="plain-syntax">, </span><span class="identifier-syntax">RELS_COPY</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Comparison. </b>It really isn't clear how to define equality for relations, but we follow
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Comparison. </b>It really isn't clear how to define equality for relations, but we follow
the doctrine above. What we don't do is to test its actual state &mdash; that
would be very slow and might be impossible.
</p>
@ -341,7 +350,7 @@ would be very slow and might be impossible.
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Printing. </b></p>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Printing. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">RELATION_TY_Say</span><span class="plain-syntax"> </span><span class="identifier-syntax">rel</span><span class="plain-syntax">;</span>
@ -349,7 +358,7 @@ would be very slow and might be impossible.
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="reserved-syntax">string</span><span class="plain-syntax">) </span><span class="identifier-syntax">RlnGetF</span><span class="plain-syntax">(</span><span class="identifier-syntax">rel</span><span class="plain-syntax">, </span><span class="identifier-syntax">RR_NAME</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Naming. </b></p>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Naming. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">RELATION_TY_Name</span><span class="plain-syntax"> </span><span class="identifier-syntax">rel</span><span class="plain-syntax"> </span><span class="identifier-syntax">txt</span><span class="plain-syntax">;</span>
@ -359,7 +368,7 @@ would be very slow and might be impossible.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Choose Relation Handler. </b>We implement two different various-to-various handler routines for the
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Choose Relation Handler. </b>We implement two different various-to-various handler routines for the
sake of efficiency. The choice of handler routines is made based on
the kinds of value being related. Each handler also has a corresponding
wrapper for symmetric relations.
@ -381,7 +390,7 @@ wrapper for symmetric relations.
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Valency. </b>"Valency" refers to the number of participants allowed on either side
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. Valency. </b>"Valency" refers to the number of participants allowed on either side
of the relation: various-to-various, one-to-various, various-to-one, or
one-to-one. A newly created relation is always various-to-various. We
allow the author to change the valency, but only if no entries have
@ -431,7 +440,7 @@ been added yet.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">PVField</span><span class="plain-syntax">(</span><span class="identifier-syntax">rel</span><span class="plain-syntax">, </span><span class="identifier-syntax">RRV_PERMISSIONS</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">VALENCY_MASK</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. Double Hash Set Relation Handler. </b>This implements relations which are stored as a double-hashed set.
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. Double Hash Set Relation Handler. </b>This implements relations which are stored as a double-hashed set.
The storage comprises a list of three-word entries \((F, X, Y)\), where
\(F\) is a flags word. The ordering of the list is determined by a probe
sequence which depends on the combined hash values of \(X\) and \(Y\).
@ -747,7 +756,7 @@ if so.
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. Hash List Relation Handler. </b>This implements relations which are stored as a hash table mapping
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>&#167;16. Hash List Relation Handler. </b>This implements relations which are stored as a hash table mapping
keys to either single values or lists of values. The storage comprises a list
of three-word entries, either \((F, X, Y)\) or \((F, X, L)\), where \(F\) is a
flags word distinguishing between the two cases (among other things). In the
@ -769,7 +778,7 @@ which is shared with two other handlers below.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">HashCoreRelationHandler</span><span class="plain-syntax">(</span><span class="identifier-syntax">rel</span><span class="plain-syntax">, </span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">kx</span><span class="plain-syntax">, </span><span class="identifier-syntax">ky</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>&#167;16. Hash Table Relation Handler. </b>This is the same as the Hash List Relation Handler above, except that only
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>&#167;17. Hash Table Relation Handler. </b>This is the same as the Hash List Relation Handler above, except that only
one value may be stored for each key. This implements various-to-one
relations.
</p>
@ -781,7 +790,7 @@ relations.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">HashCoreRelationHandler</span><span class="plain-syntax">(</span><span class="identifier-syntax">rel</span><span class="plain-syntax">, </span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">kx</span><span class="plain-syntax">, </span><span class="identifier-syntax">ky</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>&#167;17. Reversed Hash Table Relation Handler. </b>This is the same as the Hash Table Relation Handler except that the sides
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>&#167;18. Reversed Hash Table Relation Handler. </b>This is the same as the Hash Table Relation Handler except that the sides
are reversed. This implements one-to-various relations.
</p>
@ -817,7 +826,7 @@ are reversed. This implements one-to-various relations.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">HashCoreRelationHandler</span><span class="plain-syntax">(</span><span class="identifier-syntax">rel</span><span class="plain-syntax">, </span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">kx</span><span class="plain-syntax">, </span><span class="identifier-syntax">ky</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>&#167;18. Symmetric Relation Handlers. </b>These are simple wrappers around the asymmetric handlers defined above.
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>&#167;19. Symmetric Relation Handlers. </b>These are simple wrappers around the asymmetric handlers defined above.
When a pair is inserted or removed, the wrappers insert or remove the
reversed pair as well.
</p>
@ -848,7 +857,7 @@ exceeded Inform 6's 32-character name limit.)
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TwoInOneHashTableRelationHandler</span><span class="plain-syntax">(</span><span class="identifier-syntax">rel</span><span class="plain-syntax">, </span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>&#167;19. Hash Core Relation Handler. </b>This implements the core functionality that is shared between
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>&#167;20. Hash Core Relation Handler. </b>This implements the core functionality that is shared between
<span class="extract"><span class="extract-syntax">HashListRelationHandler</span></span>, <span class="extract"><span class="extract-syntax">HashTableRelationHandler</span></span>, and
<span class="extract"><span class="extract-syntax">ReversedHashTableRelationHandler</span></span>. All three handlers are the same except
for whether the left or right side is the "key" and whether or not
@ -1266,7 +1275,7 @@ the existing pair \((X, Y)\).
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>&#167;20. Equivalence Hash Table Relation Handler. </b>This implements group relations. The table format is identical to that used
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>&#167;21. Equivalence Hash Table Relation Handler. </b>This implements group relations. The table format is identical to that used
by <span class="extract"><span class="extract-syntax">HashCoreRelationHandler</span></span>, but we use it differently. Although the
relation appears to relate Xs to Xs as far as the game is concerned, the
table actually relates Xs to numbers, where each number identifies a
@ -1515,7 +1524,7 @@ situation would be inefficient, so we keep the \(Y\) entry regardless.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>&#167;21. Two-In-One Hash Table Relation Handler. </b>This implements one-to-one relations, which are stored as a hash table
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>&#167;22. Two-In-One Hash Table Relation Handler. </b>This implements one-to-one relations, which are stored as a hash table
mapping keys to single values and vice versa. To enforce the one-to-one
constraint, we need the ability to quickly check whether a value is
present. This could be done with two separate hash tables, one mapping X to Y
@ -1961,7 +1970,7 @@ and \(Y\) are the same kind of value.)
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>&#167;22. Empty. </b>This implements the "empty" adjective. We can always check whether a relation
<p class="commentary firstcommentary"><a id="SP23" class="paragraph-anchor"></a><b>&#167;23. Empty. </b>This implements the "empty" adjective. We can always check whether a relation
is empty. For most relation types, we can cause the relation to become empty by
removing all pairs: but this is impossible for equivalence relations, which are
never empty, since any \(X\) is equivalent to itself. And we can never force a

View file

@ -144,7 +144,7 @@ choosing the character set here. For Unicode, use Glulx.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">TEXT_TY_Create</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax"> </span><span class="identifier-syntax">sb_address</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">sb_address</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">sb_address</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">--&gt;0 = </span><span class="identifier-syntax">PACKED_TEXT_STORAGE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">--&gt;1 = </span><span class="identifier-syntax">EMPTY_TEXT_PACKED</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">;</span>

View file

@ -91,7 +91,7 @@ in which the player waits.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">STORED_ACTION_TY_Create</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax"> </span><span class="identifier-syntax">sb_address</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVLongBlock</span><span class="plain-syntax">(6, </span><span class="identifier-syntax">STORED_ACTION_TY</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">long_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVLongBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">STORED_ACTION_TY</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">STORA_ACTION_F</span><span class="plain-syntax">, ##</span><span class="identifier-syntax">Wait</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">STORA_NOUN_F</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">STORA_SECOND_F</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
@ -99,7 +99,7 @@ in which the player waits.
<span class="plain-syntax"> </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">STORA_REQUEST_F</span><span class="plain-syntax">, </span><span class="reserved-syntax">false</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InitialisePVLongBlockField</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">STORA_COMMAND_TEXT_F</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">sb_address</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CreatePVShortBlock</span><span class="plain-syntax">(</span><span class="identifier-syntax">sb_address</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">--&gt;0 = </span><span class="identifier-syntax">long_block</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">short_block</span><span class="plain-syntax">;</span>

View file

@ -255,14 +255,14 @@ made.
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Plugs and sockets. </b>Now suppose a symbol in package <span class="extract"><span class="extract-syntax">X</span></span> wants to refer to a meaning which
does not yet exist, and will in fact never exist in the current tree. (It will
be linked in from another tree later on.) For example, perhaps Inform 7 is
compiling a function body which needs to refer to <span class="extract"><span class="extract-syntax">PVCreate</span></span>, a function
compiling a function body which needs to refer to <span class="extract"><span class="extract-syntax">CreatePV</span></span>, a function
in BasicInformKit.
</p>
<p class="commentary">This is done by having <span class="extract"><span class="extract-syntax">PVCreate</span></span> in <span class="extract"><span class="extract-syntax">X</span></span> wire to a special symbol called
<p class="commentary">This is done by having <span class="extract"><span class="extract-syntax">CreatePV</span></span> in <span class="extract"><span class="extract-syntax">X</span></span> wire to a special symbol called
a "plug" in a special package of the tree at <span class="extract"><span class="extract-syntax">/main/connectors</span></span>.
(See <a href="../building-module/1-ls.html" class="internal">Large-Scale Structure (in building)</a> for more on this package.) That plug
is left dangling, in the sense that it is wired to the name <span class="extract"><span class="extract-syntax">"PVCreate"</span></span>,
is left dangling, in the sense that it is wired to the name <span class="extract"><span class="extract-syntax">"CreatePV"</span></span>,
but that this name is unresolved.
</p>
@ -271,7 +271,7 @@ but that this name is unresolved.
<span class="plain-syntax"> +-----------------+ +--------------------------+</span>
<span class="plain-syntax"> | Package X | | Package /main/connectors |</span>
<span class="plain-syntax"> | | | |</span>
<span class="plain-syntax"> | PVCreate ~~~~~~~~~~~~~~~&gt; _plug_BlkValueCreate ~~~~~~~&gt; "PVCreate"</span>
<span class="plain-syntax"> | CreatePV ~~~~~~~~~~~~~~~&gt; _plug_BlkValueCreate ~~~~~~~&gt; "CreatePV"</span>
<span class="plain-syntax"> +-----------------+ +--------------------------+</span>
</pre>
<p class="commentary">Meanwhile, suppose a second tree holds <a href="../BasicInformKit/index.html" class="internal">BasicInformKit</a>. This looks like so:
@ -282,18 +282,18 @@ but that this name is unresolved.
<span class="plain-syntax"> +-------------------+ +--------------------------+</span>
<span class="plain-syntax"> | Package Y | | Package /main/connectors |</span>
<span class="plain-syntax"> | | | |</span>
<span class="plain-syntax"> | PVCreate &lt;~~~~~~~~~~~~~~~~ PVCreate &lt;~~~~~~~~~~~~~~~~~~ "PVCreate"</span>
<span class="plain-syntax"> | CreatePV &lt;~~~~~~~~~~~~~~~~ CreatePV &lt;~~~~~~~~~~~~~~~~~~ "CreatePV"</span>
<span class="plain-syntax"> | ..... | +--------------------------+</span>
<span class="plain-syntax"> | function defn |</span>
<span class="plain-syntax"> | of PVCreate |</span>
<span class="plain-syntax"> | of CreatePV |</span>
<span class="plain-syntax"> | function defn |</span>
<span class="plain-syntax"> | of SecretFunction |</span>
<span class="plain-syntax"> +-------------------+</span>
</pre>
<p class="commentary">Package <span class="extract"><span class="extract-syntax">Y</span></span> in this tree holds two function definitions, let's say: <span class="extract"><span class="extract-syntax">PVCreate</span></span>
<p class="commentary">Package <span class="extract"><span class="extract-syntax">Y</span></span> in this tree holds two function definitions, let's say: <span class="extract"><span class="extract-syntax">CreatePV</span></span>
and <span class="extract"><span class="extract-syntax">SecretFunction</span></span>. The latter is private to BasicInformKit, in that the linking
process in <a href="../pipeline-module/index.html" class="internal">pipeline</a> does not allow symbols in other trees to be wired to it.
But <span class="extract"><span class="extract-syntax">PVCreate</span></span> is available. That is because the BasicInformKit provides
But <span class="extract"><span class="extract-syntax">CreatePV</span></span> is available. That is because the BasicInformKit provides
a "socket" to it.
</p>
@ -306,7 +306,7 @@ and no socket names do.
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>The point of this is that after <a href="2-trn.html" class="internal">Transmigration</a> there will be a single
tree like so, which has merged the connectors from the two original trees,
and which now contains both <span class="extract"><span class="extract-syntax">X</span></span> and <span class="extract"><span class="extract-syntax">Y</span></span>. We can npw connect the plug
<span class="extract"><span class="extract-syntax">_plug_BlkValueCreate</span></span> with the socket <span class="extract"><span class="extract-syntax">PVCreate</span></span>:
<span class="extract"><span class="extract-syntax">_plug_BlkValueCreate</span></span> with the socket <span class="extract"><span class="extract-syntax">CreatePV</span></span>:
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -314,19 +314,19 @@ and which now contains both <span class="extract"><span class="extract-syntax">X
<span class="plain-syntax">. +-----------------+ +--------------------------+ .</span>
<span class="plain-syntax">. | Package X | | Package /main/connectors | .</span>
<span class="plain-syntax">. | | | | .</span>
<span class="plain-syntax">. | PVCreate ~~~~~~~~~~~~~~&gt; _plug_BlkValueCreate ~~~~~~~\ .</span>
<span class="plain-syntax">. | CreatePV ~~~~~~~~~~~~~~&gt; _plug_BlkValueCreate ~~~~~~~\ .</span>
<span class="plain-syntax">. +-----------------+ | | \ .</span>
<span class="plain-syntax">. | | | .</span>
<span class="plain-syntax">. +-----------------+ | | | .</span>
<span class="plain-syntax">. | Package Y | | | | .</span>
<span class="plain-syntax">. | | | | / .</span>
<span class="plain-syntax">. | PVCreate &lt;~~~~~~~~~~~~~~~ PVCreate &lt;~~~~~~~~~~~~~~~~~/ .</span>
<span class="plain-syntax">. | CreatePV &lt;~~~~~~~~~~~~~~~ CreatePV &lt;~~~~~~~~~~~~~~~~~/ .</span>
<span class="plain-syntax">. | ..... | +--------------------------+ .</span>
<span class="plain-syntax">. | function defn | .</span>
<span class="plain-syntax">. +-----------------+ .</span>
<span class="plain-syntax">...............................................................</span>
</pre>
<p class="commentary">The cable end from <span class="extract"><span class="extract-syntax">PVCreate</span></span> in <span class="extract"><span class="extract-syntax">X</span></span> is indeed the definition in <span class="extract"><span class="extract-syntax">Y</span></span>,
<p class="commentary">The cable end from <span class="extract"><span class="extract-syntax">CreatePV</span></span> in <span class="extract"><span class="extract-syntax">X</span></span> is indeed the definition in <span class="extract"><span class="extract-syntax">Y</span></span>,
and all is well.
</p>
@ -341,7 +341,7 @@ up the offer. The only essential thing is that all plugs must find a socket.
<ul class="items"><li>&#9679; Every socket is always wired.
</li><li>&#9679; Every plug is either wired to a socket, or to a name, in the hope that
it will one day be wired to a socket of that name.
</li><li>&#9679; All uses of, say, <span class="extract"><span class="extract-syntax">PVCreate</span></span> in the main tree are wired to a single
</li><li>&#9679; All uses of, say, <span class="extract"><span class="extract-syntax">CreatePV</span></span> in the main tree are wired to a single
plug in its <span class="extract"><span class="extract-syntax">/main/connectors</span></span> package.
</li><li>&#9679; By looking at the incoming count of a plug or socket, we can see if it is
still needed &mdash; if the count falls to 0, it is not.

View file

@ -72,7 +72,7 @@ MathJax = {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../services.html">Services</a></li><li><a href="index.html">kinds</a></li><li><a href="index.html#2">Chapter 2: Kinds</a></li><li><b>Using Kinds</b></li></ul></div>
<p class="purpose">To determine the characteristics of different kinds, enabling them to be used in practice.</p>
<ul class="toc"><li><a href="2-uk.html#SP1">&#167;1. Names of kinds</a></li><li><a href="2-uk.html#SP2">&#167;2. Being an object</a></li><li><a href="2-uk.html#SP3">&#167;3. Definiteness</a></li><li><a href="2-uk.html#SP5">&#167;5. (A) How this came into being</a></li><li><a href="2-uk.html#SP12">&#167;12. (B) Command parsing</a></li><li><a href="2-uk.html#SP13">&#167;13. (C) Compatibility with other kinds</a></li><li><a href="2-uk.html#SP14">&#167;14. (D) How constant values of this kind are expressed</a></li><li><a href="2-uk.html#SP17">&#167;17. (G) Performing arithmetic</a></li><li><a href="2-uk.html#SP20">&#167;20. (H) An identifier name</a></li><li><a href="2-uk.html#SP21">&#167;21. (I) Storing values at run-time</a></li><li><a href="2-uk.html#SP26">&#167;26. (K) Pointer-value support</a></li><li><a href="2-uk.html#SP27">&#167;27. (L) Indexing and documentation</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="2-uk.html#SP1">&#167;1. Names of kinds</a></li><li><a href="2-uk.html#SP2">&#167;2. Being an object</a></li><li><a href="2-uk.html#SP3">&#167;3. Definiteness</a></li><li><a href="2-uk.html#SP5">&#167;5. (A) How this came into being</a></li><li><a href="2-uk.html#SP12">&#167;12. (B) Command parsing</a></li><li><a href="2-uk.html#SP13">&#167;13. (C) Compatibility with other kinds</a></li><li><a href="2-uk.html#SP14">&#167;14. (D) How constant values of this kind are expressed</a></li><li><a href="2-uk.html#SP17">&#167;17. (G) Performing arithmetic</a></li><li><a href="2-uk.html#SP20">&#167;20. (H) An identifier name</a></li><li><a href="2-uk.html#SP21">&#167;21. (I) Storing values at run-time</a></li><li><a href="2-uk.html#SP27">&#167;27. (K) Pointer-value support</a></li><li><a href="2-uk.html#SP28">&#167;28. (L) Indexing and documentation</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Names of kinds. </b></p>
@ -428,26 +428,41 @@ takes depends on its kind:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP24" class="function-link"><span class="function-syntax">KindConstructors::uses_block_values</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>&#167;22. </b>Exactly how large the small block is:
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>&#167;22. </b>Exactly how large the small block is. The addition of 2 here is to allow for
the short block header size in a short-block-only pointer value, and must
correspond to the constant ```SBONLYPV_FIELDS``` defined in
```BasicInformKit```.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::get_short_block_size</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">short_block_size</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">SB</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">short_block_size</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">long_block_size</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">flexible_long_block_size</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)) </span><span class="identifier-syntax">SB</span><span class="plain-syntax"> += </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">SB</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP23" class="paragraph-anchor"></a><b>&#167;23. </b>A reasonable estimate of how large the (larger!) heap block needs to be,
for a pointer-value kind, in bytes.
<p class="commentary firstcommentary"><a id="SP23" class="paragraph-anchor"></a><b>&#167;23. </b>A minimum field count for the long block:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::get_heap_size_estimate</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::get_long_block_size</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">heap_size_estimate</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">long_block_size</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP24" class="paragraph-anchor"></a><b>&#167;24. </b>And the following returns the name of an I6 routine to determine if two
<p class="commentary firstcommentary"><a id="SP24" class="paragraph-anchor"></a><b>&#167;24. </b>0 if the long block is not flexible in size, and otherwise its typical
likely number of fields in practice.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Behaviour::get_flexible_long_block_size</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">flexible_long_block_size</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP25" class="paragraph-anchor"></a><b>&#167;25. </b>And the following returns the name of an I6 routine to determine if two
values of \(K\) are different from each other; or <span class="extract"><span class="extract-syntax">NULL</span></span> to say that it's
sufficient to apply <span class="extract"><span class="extract-syntax">~=</span></span> to the values.
</p>
@ -458,7 +473,7 @@ sufficient to apply <span class="extract"><span class="extract-syntax">~=</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">distinguish_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP25" class="paragraph-anchor"></a><b>&#167;25. </b>Can values of this kind be serialised out to a file and read back in again
<p class="commentary firstcommentary"><a id="SP26" class="paragraph-anchor"></a><b>&#167;26. </b>Can values of this kind be serialised out to a file and read back in again
by some other Inform story file, or by this one running on a different day?
</p>
@ -468,7 +483,7 @@ by some other Inform story file, or by this one running on a different day?
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">can_exchange</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP26" class="paragraph-anchor"></a><b>&#167;26. (K) Pointer-value support. </b></p>
<p class="commentary firstcommentary"><a id="SP27" class="paragraph-anchor"></a><b>&#167;27. (K) Pointer-value support. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Behaviour::get_create_function</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
@ -526,7 +541,7 @@ by some other Inform story file, or by this one running on a different day?
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-kc2.html#SP22" class="function-link"><span class="function-syntax">KindConstructors::get_unserialise_fn_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP27" class="paragraph-anchor"></a><b>&#167;27. (L) Indexing and documentation. </b></p>
<p class="commentary firstcommentary"><a id="SP28" class="paragraph-anchor"></a><b>&#167;28. (L) Indexing and documentation. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Behaviour::get_documentation_reference</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
@ -539,7 +554,7 @@ by some other Inform story file, or by this one running on a different day?
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">documentation_reference</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">dr</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP28" class="paragraph-anchor"></a><b>&#167;28. </b>The following is used in the Kinds index, in the table showing the default
<p class="commentary firstcommentary"><a id="SP29" class="paragraph-anchor"></a><b>&#167;29. </b>The following is used in the Kinds index, in the table showing the default
values for each kind:
</p>
@ -569,7 +584,7 @@ values for each kind:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">indexed_grey_if_empty</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP29" class="paragraph-anchor"></a><b>&#167;29. </b>And every kind is allowed to have the specification pseudo-property &mdash; a little
<p class="commentary firstcommentary"><a id="SP30" class="paragraph-anchor"></a><b>&#167;30. </b>And every kind is allowed to have the specification pseudo-property &mdash; a little
text used only on the index pages, and not existing at run-time.
</p>

View file

@ -113,12 +113,12 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">can_exchange</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">indexed_grey_if_empty</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">is_incompletely_defined</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">multiple_block</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">forbid_assertion_creation</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_INTEGER_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">heap_size_estimate</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_INTEGER_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">index_priority</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_INTEGER_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">short_block_size</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_INTEGER_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block_size</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_INTEGER_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">flexible_long_block_size</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_CCM_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">constant_compilation_method</span><span class="plain-syntax">)</span>

View file

@ -127,11 +127,11 @@ set by commands in Neptune files, others set by calls from Inform.
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_constructor_compilation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">short_block_size</span><span class="plain-syntax">; </span><span class="comment-syntax"> if stored as a block value, size in words of the SB</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> I: storing values at run-time</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">multiple_block</span><span class="plain-syntax">; </span><span class="comment-syntax"> TRUE for flexible-size values stored on the heap</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">heap_size_estimate</span><span class="plain-syntax">; </span><span class="comment-syntax"> typical number of bytes used</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">short_block_size</span><span class="plain-syntax">; </span><span class="comment-syntax"> if stored as a block value, size in words of the SB</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">long_block_size</span><span class="plain-syntax">; </span><span class="comment-syntax"> if stored as a block value, minimum number of LB fields</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">flexible_long_block_size</span><span class="plain-syntax">; </span><span class="comment-syntax"> if stored as a block value, typical number of LB fields</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">can_exchange</span><span class="plain-syntax">; </span><span class="comment-syntax"> with external files and therefore other story files</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">distinguish_function</span><span class="plain-syntax">; </span><span class="comment-syntax"> Inter routine to see if values distinguishable</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">kind_constructor_comparison_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_comparison_schema</span><span class="plain-syntax">; </span><span class="comment-syntax"> list of these</span>
@ -356,9 +356,9 @@ we apply any defaults set in Neptune files.
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">class_number</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> I: storing values at run-time</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">multiple_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">long_block_size</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">flexible_long_block_size</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">short_block_size</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">heap_size_estimate</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">can_exchange</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_comparison_schema</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">distinguish_function</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
@ -684,57 +684,57 @@ file creating it (if any were: by default this will be empty):
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>&#167;22. Tedious access functions. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_create_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_create_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_create_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_create_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">create_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_cast_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_cast_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_cast_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_cast_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cast_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_copy_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_copy_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_copy_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_copy_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">copy_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_copy_short_block_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup26')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup26">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_copy_short_block_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_copy_short_block_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup26')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup26">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_copy_short_block_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">copy_short_block_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_quick_copy_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_quick_copy_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_quick_copy_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_quick_copy_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">quick_copy_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_destroy_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup28')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup28">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_destroy_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_destroy_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup28')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup28">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_destroy_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">destroy_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_make_mutable_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup29')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup29">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_make_mutable_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_make_mutable_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup29')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup29">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_make_mutable_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">make_mutable_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_hash_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup30')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup30">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_hash_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_hash_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup30')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup30">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_hash_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">hash_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_long_block_size_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup31')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup31">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_long_block_size_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_long_block_size_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup31')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup31">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_long_block_size_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">long_block_size_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_serialise_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup32')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup32">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_serialise_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_serialise_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup32')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup32">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_serialise_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">serialise_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_unserialise_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup33')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup33">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_unserialise_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">KindConstructors::get_unserialise_fn_identifier</span><button class="popup" onclick="togglePopup('usagePopup33')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup33">Usage of <span class="code-font"><span class="function-syntax">KindConstructors::get_unserialise_fn_identifier</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unserialise_function</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>

View file

@ -101,7 +101,6 @@ function togglePopup(material_id) {
<span class="definition-keyword">enum</span> <span class="constant-syntax">documentation_reference_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">understand_function_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">forbid_assertion_creation_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">heap_size_estimate_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">printing_routine_for_debugging_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">say_function_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">index_default_value_KCC</span>
@ -113,7 +112,8 @@ function togglePopup(material_id) {
<span class="definition-keyword">enum</span> <span class="constant-syntax">is_incompletely_defined_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">loop_domain_schema_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">modifying_adjective_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">multiple_block_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">long_block_size_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">flexible_long_block_size_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">plural_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">recognise_function_KCC</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">singular_KCC</span>
@ -139,7 +139,10 @@ function togglePopup(material_id) {
<span class="plain-syntax"> { </span><span class="string-syntax">"can-exchange"</span><span class="plain-syntax">, </span><span class="constant-syntax">can_exchange_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"indexed-grey-if-empty"</span><span class="plain-syntax">, </span><span class="constant-syntax">indexed_grey_if_empty_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"is-incompletely-defined"</span><span class="plain-syntax">, </span><span class="constant-syntax">is_incompletely_defined_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"multiple-block"</span><span class="plain-syntax">, </span><span class="constant-syntax">multiple_block_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"multiple-block"</span><span class="plain-syntax">, -1, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"'multiple-block: no' can be omitted; 'multiple-block: yes' should now be 'flexible-long-block-size: N' for some typical field count N"</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"long-block-size"</span><span class="plain-syntax">, </span><span class="constant-syntax">long_block_size_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"flexible-long-block-size"</span><span class="plain-syntax">, </span><span class="constant-syntax">flexible_long_block_size_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"forbid-assertion-creation"</span><span class="plain-syntax">, </span><span class="constant-syntax">forbid_assertion_creation_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">BOOLEAN_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"constant-compilation-method"</span><span class="plain-syntax">, </span><span class="constant-syntax">constant_compilation_method_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">CCM_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
@ -189,7 +192,6 @@ function togglePopup(material_id) {
<span class="plain-syntax"> { </span><span class="string-syntax">"singular"</span><span class="plain-syntax">, </span><span class="constant-syntax">singular_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">VOCABULARY_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"terms"</span><span class="plain-syntax">, </span><span class="constant-syntax">terms_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"heap-size-estimate"</span><span class="plain-syntax">, </span><span class="constant-syntax">heap_size_estimate_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"index-priority"</span><span class="plain-syntax">, </span><span class="constant-syntax">index_priority_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> },</span>
<span class="plain-syntax"> { </span><span class="string-syntax">"small-block-size"</span><span class="plain-syntax">, </span><span class="constant-syntax">short_block_size_KCC</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMERIC_KCA</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this command has been renamed 'short-block-size'"</span><span class="plain-syntax"> },</span>

View file

@ -339,12 +339,10 @@ or higher is therefore that of a derived kind.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Metadata::read_optional_numeric</span><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"^short_block_size"</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">SB</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Metadata::read_numeric</span><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"^short_block_size"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-su.html#SP8" class="function-link"><span class="function-syntax">Synoptic::numeric_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SB</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="5-su.html#SP8" class="function-link"><span class="function-syntax">Synoptic::numeric_entry</span></a><span class="plain-syntax">(1);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">SB</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Metadata::read_optional_numeric</span><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"^short_block_size"</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SB</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Metadata::read_numeric</span><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"^short_block_size"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-su.html#SP8" class="function-link"><span class="function-syntax">Synoptic::numeric_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SB</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-knd.html#SP1_3">&#167;1.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP1_3_17" class="paragraph-anchor"></a><b>&#167;1.3.17. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Long block size function field</span><span class="named-paragraph-number">1.3.17</span></span><span class="comment-syntax"> =</span>
@ -355,7 +353,12 @@ or higher is therefore that of a derived kind.
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">long_block_size_fn_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Metadata::required_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"^long_block_size_fn"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-su.html#SP8" class="function-link"><span class="function-syntax">Synoptic::symbol_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">long_block_size_fn_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="5-su.html#SP8" class="function-link"><span class="function-syntax">Synoptic::numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Metadata::read_optional_numeric</span><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"^long_block_size"</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">LB</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Metadata::read_numeric</span><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"^long_block_size"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-su.html#SP8" class="function-link"><span class="function-syntax">Synoptic::numeric_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">LB</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="5-su.html#SP8" class="function-link"><span class="function-syntax">Synoptic::numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-knd.html#SP1_3">&#167;1.3</a>.</li></ul>

View file

@ -92,7 +92,7 @@ messages.
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::generic_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">DefaultValues::val</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">DefaultValues::val</span></span>:<br/>Kind Constructors - <a href="5-kc.html#SP32_3_23">&#167;32.3.23</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">storage_name</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">DefaultValues::val</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">DefaultValues::val</span></span>:<br/>Kind Constructors - <a href="5-kc.html#SP32_3_24">&#167;32.3.24</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">storage_name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> </span><span class="identifier-syntax">VH</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Holsters::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTER_DATA_VHMODE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><a href="2-dv.html#SP1" class="function-link"><span class="function-syntax">DefaultValues::to_holster</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">storage_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Holsters::unholster_to_code_val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), &amp;</span><span class="identifier-syntax">VH</span><span class="plain-syntax">);</span>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -107,7 +107,7 @@ properties.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTShowmeCommand::compile_kind_showme_fn</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">RTShowmeCommand::compile_kind_showme_fn</span></span>:<br/>Kind Constructors - <a href="5-kc.html#SP32_3_29">&#167;32.3.29</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTShowmeCommand::compile_kind_showme_fn</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">RTShowmeCommand::compile_kind_showme_fn</span></span>:<br/>Kind Constructors - <a href="5-kc.html#SP32_3_30">&#167;32.3.30</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Functions::begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">which_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalVariables::new_other_as_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"which"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">na_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalVariables::new_other_as_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"na"</span><span class="plain-syntax">);</span>

View file

@ -118,9 +118,9 @@ which is then not stored on the stack.
<span class="plain-syntax">} </span><span class="reserved-syntax">heap_allocation</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure heap_allocation is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>Every kind of block value can give an estimate of its likely size needs &mdash; its
exact size needs if it is fixed in size, and a reasonable overestimate of typical
usage if it is flexible.
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>We want to make an estimate of the likely size needs of such a value if placed
on the heap &mdash; its exact size needs if it is fixed in size, and a reasonable
overestimate of typical usage if it is flexible.
</p>
<p class="commentary">The <span class="extract"><span class="extract-syntax">multiplier</span></span> is used when we need to calculate the size of, say, a list of
@ -133,10 +133,14 @@ through to the returned record; we don't understand any of that here.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">stack_offset</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_block_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"unable to allocate heap storage for this kind of value"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::get_heap_size_estimate</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no heap storage estimate for this kind of value"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">total_heap_allocation</span><span class="plain-syntax"> += (</span><span class="identifier-syntax">Kinds::Behaviour::get_heap_size_estimate</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) + </span><span class="constant-syntax">8</span><span class="plain-syntax">)*</span><span class="identifier-syntax">multiplier</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">estimate</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax"> + </span><span class="identifier-syntax">Kinds::Behaviour::get_short_block_size</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::get_flexible_long_block_size</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">estimate</span><span class="plain-syntax"> += </span><span class="identifier-syntax">Kinds::Behaviour::get_flexible_long_block_size</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">estimate</span><span class="plain-syntax"> += </span><span class="identifier-syntax">Kinds::Behaviour::get_long_block_size</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">total_heap_allocation</span><span class="plain-syntax"> += (</span><span class="identifier-syntax">estimate</span><span class="plain-syntax"> + </span><span class="constant-syntax">8</span><span class="plain-syntax">)*</span><span class="identifier-syntax">multiplier</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">heap_allocation</span><span class="plain-syntax"> </span><span class="identifier-syntax">ha</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ha</span><span class="plain-syntax">.</span><span class="element-syntax">allocated_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>

View file

@ -89,7 +89,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">icd</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTInstances::value_iname</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">RTInstances::value_iname</span></span>:<br/><a href="5-ins.html#SP4">&#167;4</a>, <a href="5-ins.html#SP4_1">&#167;4.1</a>, <a href="5-ins.html#SP5">&#167;5</a><br/>Default Values - <a href="2-dv.html#SP2_4">&#167;2.4</a><br/>Instance Counting - <a href="2-ic.html#SP8">&#167;8</a><br/>Short Names - <a href="2-sn.html#SP4_1">&#167;4.1</a><br/>List Literals - <a href="4-ll.html#SP7_1">&#167;7.1</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">&#167;1</a><br/>Backdrop Instances - <a href="5-bi.html#SP2_1">&#167;2.1</a><br/>Door Instances - <a href="5-di.html#SP3">&#167;3</a>, <a href="5-di.html#SP5">&#167;5</a>, <a href="5-di.html#SP6">&#167;6</a><br/>Region Instances - <a href="5-ri.html#SP2">&#167;2</a><br/>Scene Instances - <a href="5-si.html#SP1">&#167;1</a><br/>Dialogue Beat Instances - <a href="5-dbi.html#SP1">&#167;1</a>, <a href="5-dbi.html#SP2">&#167;2</a>, <a href="5-dbi.html#SP2_4">&#167;2.4</a>, <a href="5-dbi.html#SP2_5">&#167;2.5</a>, <a href="5-dbi.html#SP2_6">&#167;2.6</a>, <a href="5-dbi.html#SP2_7_2_1">&#167;2.7.2.1</a>, <a href="5-dbi.html#SP2_8_1">&#167;2.8.1</a>, <a href="5-dbi.html#SP3">&#167;3</a><br/>Dialogue - <a href="5-dli.html#SP3_3">&#167;3.3</a>, <a href="5-dli.html#SP3_4">&#167;3.4</a>, <a href="5-dli.html#SP3_6">&#167;3.6</a>, <a href="5-dli.html#SP3_7">&#167;3.7</a>, <a href="5-dli.html#SP3_13">&#167;3.13</a>, <a href="5-dli.html#SP5">&#167;5</a><br/>Dialogue Choice Instances - <a href="5-dci.html#SP3_4">&#167;3.4</a><br/>Rulebooks - <a href="5-rlb.html#SP8_1">&#167;8.1</a><br/>Kind Constructors - <a href="5-kc.html#SP28">&#167;28</a>, <a href="5-kc.html#SP32_3_27">&#167;32.3.27</a><br/>Test Scripts - <a href="5-ts.html#SP4">&#167;4</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP1">&#167;1</a>, <a href="6-tm.html#SP2">&#167;2</a><br/>Property Permissions - <a href="6-pp.html#SP1">&#167;1</a>, <a href="6-pp.html#SP3">&#167;3</a><br/>Mapping Hints - <a href="6-mh.html#SP1">&#167;1</a><br/>Kind GPRs - <a href="7-kg.html#SP5_1_1_1">&#167;5.1.1.1</a>, <a href="7-kg.html#SP5_1_1_2">&#167;5.1.1.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTInstances::value_iname</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">RTInstances::value_iname</span></span>:<br/><a href="5-ins.html#SP4">&#167;4</a>, <a href="5-ins.html#SP4_1">&#167;4.1</a>, <a href="5-ins.html#SP5">&#167;5</a><br/>Default Values - <a href="2-dv.html#SP2_4">&#167;2.4</a><br/>Instance Counting - <a href="2-ic.html#SP8">&#167;8</a><br/>Short Names - <a href="2-sn.html#SP4_1">&#167;4.1</a><br/>List Literals - <a href="4-ll.html#SP7_1">&#167;7.1</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">&#167;1</a><br/>Backdrop Instances - <a href="5-bi.html#SP2_1">&#167;2.1</a><br/>Door Instances - <a href="5-di.html#SP3">&#167;3</a>, <a href="5-di.html#SP5">&#167;5</a>, <a href="5-di.html#SP6">&#167;6</a><br/>Region Instances - <a href="5-ri.html#SP2">&#167;2</a><br/>Scene Instances - <a href="5-si.html#SP1">&#167;1</a><br/>Dialogue Beat Instances - <a href="5-dbi.html#SP1">&#167;1</a>, <a href="5-dbi.html#SP2">&#167;2</a>, <a href="5-dbi.html#SP2_4">&#167;2.4</a>, <a href="5-dbi.html#SP2_5">&#167;2.5</a>, <a href="5-dbi.html#SP2_6">&#167;2.6</a>, <a href="5-dbi.html#SP2_7_2_1">&#167;2.7.2.1</a>, <a href="5-dbi.html#SP2_8_1">&#167;2.8.1</a>, <a href="5-dbi.html#SP3">&#167;3</a><br/>Dialogue - <a href="5-dli.html#SP3_3">&#167;3.3</a>, <a href="5-dli.html#SP3_4">&#167;3.4</a>, <a href="5-dli.html#SP3_6">&#167;3.6</a>, <a href="5-dli.html#SP3_7">&#167;3.7</a>, <a href="5-dli.html#SP3_13">&#167;3.13</a>, <a href="5-dli.html#SP5">&#167;5</a><br/>Dialogue Choice Instances - <a href="5-dci.html#SP3_4">&#167;3.4</a><br/>Rulebooks - <a href="5-rlb.html#SP8_1">&#167;8.1</a><br/>Kind Constructors - <a href="5-kc.html#SP28">&#167;28</a>, <a href="5-kc.html#SP32_3_28">&#167;32.3.28</a><br/>Test Scripts - <a href="5-ts.html#SP4">&#167;4</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP1">&#167;1</a>, <a href="6-tm.html#SP2">&#167;2</a><br/>Property Permissions - <a href="6-pp.html#SP1">&#167;1</a>, <a href="6-pp.html#SP3">&#167;3</a><br/>Mapping Hints - <a href="6-mh.html#SP1">&#167;1</a><br/>Kind GPRs - <a href="7-kg.html#SP5_1_1_1">&#167;5.1.1.1</a>, <a href="7-kg.html#SP5_1_1_2">&#167;5.1.1.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">instance_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>

View file

@ -140,7 +140,7 @@ of the program, but we try to be tidy about where to put it.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::kind_package</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::kind_package</span></span>:<br/><a href="5-kc.html#SP11">&#167;11</a>, <a href="5-kc.html#SP12">&#167;12</a>, <a href="5-kc.html#SP19">&#167;19</a>, <a href="5-kc.html#SP32_3_2">&#167;32.3.2</a>, <a href="5-kc.html#SP32_3_3">&#167;32.3.3</a>, <a href="5-kc.html#SP32_3_4">&#167;32.3.4</a>, <a href="5-kc.html#SP32_3_5">&#167;32.3.5</a>, <a href="5-kc.html#SP32_3_28">&#167;32.3.28</a><br/>Hierarchy - <a href="2-hrr.html#SP10">&#167;10</a><br/>Instance Counting - <a href="2-ic.html#SP10_2">&#167;10.2</a><br/>Short Names - <a href="2-sn.html#SP1">&#167;1</a><br/>List Literals - <a href="4-ll.html#SP7">&#167;7</a><br/>Property Permissions - <a href="6-pp.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::kind_package</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::kind_package</span></span>:<br/><a href="5-kc.html#SP11">&#167;11</a>, <a href="5-kc.html#SP12">&#167;12</a>, <a href="5-kc.html#SP19">&#167;19</a>, <a href="5-kc.html#SP32_3_2">&#167;32.3.2</a>, <a href="5-kc.html#SP32_3_3">&#167;32.3.3</a>, <a href="5-kc.html#SP32_3_4">&#167;32.3.4</a>, <a href="5-kc.html#SP32_3_5">&#167;32.3.5</a>, <a href="5-kc.html#SP32_3_29">&#167;32.3.29</a><br/>Hierarchy - <a href="2-hrr.html#SP10">&#167;10</a><br/>Instance Counting - <a href="2-ic.html#SP10_2">&#167;10.2</a><br/>Short Names - <a href="2-sn.html#SP1">&#167;1</a><br/>List Literals - <a href="4-ll.html#SP7">&#167;7</a><br/>Property Permissions - <a href="6-pp.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">construct</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -240,7 +240,7 @@ of the kind which the constructor makes:
<span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DECREMENT_FN_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">)))</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::default_value_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::default_value_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_22">&#167;32.3.22</a>, <a href="5-kc.html#SP32_3_23">&#167;32.3.23</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::default_value_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::default_value_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_23">&#167;32.3.23</a>, <a href="5-kc.html#SP32_3_24">&#167;32.3.24</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RETURN_INAME_IN</span><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">, </span><span class="identifier-syntax">default_value_fn_iname</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">MKDEF_FN_HL</span><span class="plain-syntax">, </span><a href="5-kc.html#SP2" class="function-link"><span class="function-syntax">RTKindConstructors::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">)))</span>
<span class="plain-syntax">}</span>
@ -264,7 +264,7 @@ is not otherwise created:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::comparison_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::comparison_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_21">&#167;32.3.21</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::comparison_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::comparison_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_22">&#167;32.3.22</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-kc.html#SP8" class="function-link"><span class="function-syntax">RTKindConstructors::comparison_function_provided_by_kit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
@ -316,15 +316,15 @@ declarations of pointer-valued kinds.
<span class="plain-syntax"> </span><span class="identifier-syntax">PASS_KC_FUNCTION</span><span class="plain-syntax">(</span><span class="identifier-syntax">hash</span><span class="plain-syntax">)</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::long_block_size_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::long_block_size_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_18">&#167;32.3.18</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::long_block_size_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::long_block_size_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_19">&#167;32.3.19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PASS_KC_FUNCTION</span><span class="plain-syntax">(</span><span class="identifier-syntax">long_block_size</span><span class="plain-syntax">)</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::serialise_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::serialise_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_19">&#167;32.3.19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::serialise_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::serialise_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_20">&#167;32.3.20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PASS_KC_FUNCTION</span><span class="plain-syntax">(</span><span class="identifier-syntax">serialise</span><span class="plain-syntax">)</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::unserialise_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::unserialise_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_20">&#167;32.3.20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::unserialise_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::unserialise_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_21">&#167;32.3.21</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PASS_KC_FUNCTION</span><span class="plain-syntax">(</span><span class="identifier-syntax">unserialise</span><span class="plain-syntax">)</span>
<span class="plain-syntax">}</span>
</pre>
@ -456,7 +456,7 @@ sequence position in the enumeration:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::printing_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup30')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup30">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::printing_fn_iname</span></span>:<br/><a href="5-kc.html#SP18">&#167;18</a>, <a href="5-kc.html#SP32_3_24">&#167;32.3.24</a>, <a href="5-kc.html#SP32_3_25">&#167;32.3.25</a>, <a href="5-kc.html#SP32_3_26">&#167;32.3.26</a>, <a href="5-kc.html#SP32_3_27">&#167;32.3.27</a><br/>Showme Command - <a href="2-sc.html#SP6_1_1_1">&#167;6.1.1.1</a><br/>Relations - <a href="5-rlt.html#SP10_2">&#167;10.2</a><br/>Actions - <a href="5-act2.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::printing_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup30')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup30">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::printing_fn_iname</span></span>:<br/><a href="5-kc.html#SP18">&#167;18</a>, <a href="5-kc.html#SP32_3_25">&#167;32.3.25</a>, <a href="5-kc.html#SP32_3_26">&#167;32.3.26</a>, <a href="5-kc.html#SP32_3_27">&#167;32.3.27</a>, <a href="5-kc.html#SP32_3_28">&#167;32.3.28</a><br/>Showme Command - <a href="2-sc.html#SP6_1_1_1">&#167;6.1.1.1</a><br/>Relations - <a href="5-rlt.html#SP10_2">&#167;10.2</a><br/>Actions - <a href="5-act2.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"null kind has no printing routine"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::weaken</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">);</span>
@ -560,7 +560,7 @@ SHOWME, or the phrase "showme", also for debugging purposes.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::showme_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup32')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup32">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::showme_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_28">&#167;32.3.28</a>, <a href="5-kc.html#SP32_3_29">&#167;32.3.29</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindConstructors::showme_fn_iname</span><button class="popup" onclick="togglePopup('usagePopup32')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup32">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::showme_fn_iname</span></span>:<br/><a href="5-kc.html#SP32_3_29">&#167;32.3.29</a>, <a href="5-kc.html#SP32_3_30">&#167;32.3.30</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RETURN_INAME_IN</span><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">, </span><span class="identifier-syntax">showme_fn_iname</span><span class="plain-syntax">,</span>
@ -670,7 +670,7 @@ in parsing. See <a href="7-pnp.html" class="internal">Parse Name Properties</a>.
<p class="commentary firstcommentary"><a id="SP25" class="paragraph-anchor"></a><b>&#167;25. Miscellaneous utility functions. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKindConstructors::is_subkind_of_object</span><button class="popup" onclick="togglePopup('usagePopup39')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup39">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::is_subkind_of_object</span></span>:<br/><a href="5-kc.html#SP32_2">&#167;32.2</a>, <a href="5-kc.html#SP32_2_5">&#167;32.2.5</a>, <a href="5-kc.html#SP32_2_6">&#167;32.2.6</a>, <a href="5-kc.html#SP32_3">&#167;32.3</a>, <a href="5-kc.html#SP32_3_23">&#167;32.3.23</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKindConstructors::is_subkind_of_object</span><button class="popup" onclick="togglePopup('usagePopup39')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup39">Usage of <span class="code-font"><span class="function-syntax">RTKindConstructors::is_subkind_of_object</span></span>:<br/><a href="5-kc.html#SP32_2">&#167;32.2</a>, <a href="5-kc.html#SP32_2_5">&#167;32.2.5</a>, <a href="5-kc.html#SP32_2_6">&#167;32.2.6</a>, <a href="5-kc.html#SP32_3">&#167;32.3</a>, <a href="5-kc.html#SP32_3_24">&#167;32.3.24</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::base_construction</span><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -1055,43 +1055,44 @@ or can come from the Neptune file creating a kind.
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_15" class="named-paragraph-link"><span class="named-paragraph">Apply make-mutable function metadata</span><span class="named-paragraph-number">32.3.15</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_16" class="named-paragraph-link"><span class="named-paragraph">Apply hash function metadata</span><span class="named-paragraph-number">32.3.16</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_17" class="named-paragraph-link"><span class="named-paragraph">Apply short-block-size metadata</span><span class="named-paragraph-number">32.3.17</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_18" class="named-paragraph-link"><span class="named-paragraph">Apply long-block-size function metadata</span><span class="named-paragraph-number">32.3.18</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_19" class="named-paragraph-link"><span class="named-paragraph">Apply serialise function metadata</span><span class="named-paragraph-number">32.3.19</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_20" class="named-paragraph-link"><span class="named-paragraph">Apply unserialise function metadata</span><span class="named-paragraph-number">32.3.20</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_18" class="named-paragraph-link"><span class="named-paragraph">Apply long-block-size metadata</span><span class="named-paragraph-number">32.3.18</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_19" class="named-paragraph-link"><span class="named-paragraph">Apply long-block-size function metadata</span><span class="named-paragraph-number">32.3.19</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_20" class="named-paragraph-link"><span class="named-paragraph">Apply serialise function metadata</span><span class="named-paragraph-number">32.3.20</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_21" class="named-paragraph-link"><span class="named-paragraph">Apply unserialise function metadata</span><span class="named-paragraph-number">32.3.21</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="5-kc.html#SP25" class="function-link"><span class="function-syntax">RTKindConstructors::is_subkind_of_object</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">KindConstructors::is_definite</span><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">KindConstructors::uses_signed_comparisons</span><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_21" class="named-paragraph-link"><span class="named-paragraph">Apply comparison function metadata</span><span class="named-paragraph-number">32.3.21</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_22" class="named-paragraph-link"><span class="named-paragraph">Apply comparison function metadata</span><span class="named-paragraph-number">32.3.22</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::definite</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_22" class="named-paragraph-link"><span class="named-paragraph">Apply make-default-value function metadata</span><span class="named-paragraph-number">32.3.22</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_23" class="named-paragraph-link"><span class="named-paragraph">Compile make-default-value function</span><span class="named-paragraph-number">32.3.23</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_23" class="named-paragraph-link"><span class="named-paragraph">Apply make-default-value function metadata</span><span class="named-paragraph-number">32.3.23</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_24" class="named-paragraph-link"><span class="named-paragraph">Compile make-default-value function</span><span class="named-paragraph-number">32.3.24</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-kc.html#SP25" class="function-link"><span class="function-syntax">RTKindConstructors::is_subkind_of_object</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_24" class="named-paragraph-link"><span class="named-paragraph">Apply printing function metadata</span><span class="named-paragraph-number">32.3.24</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_25" class="named-paragraph-link"><span class="named-paragraph">Apply printing function metadata</span><span class="named-paragraph-number">32.3.25</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_an_enumeration</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_27" class="named-paragraph-link"><span class="named-paragraph">Compile printing function for an enumerated kind</span><span class="named-paragraph-number">32.3.27</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_28" class="named-paragraph-link"><span class="named-paragraph">Compile printing function for an enumerated kind</span><span class="named-paragraph-number">32.3.28</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Kinds::Behaviour::is_built_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_an_enumeration</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_quasinumerical</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_26" class="named-paragraph-link"><span class="named-paragraph">Compile printing function for a unit kind</span><span class="named-paragraph-number">32.3.26</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_27" class="named-paragraph-link"><span class="named-paragraph">Compile printing function for a unit kind</span><span class="named-paragraph-number">32.3.27</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_25" class="named-paragraph-link"><span class="named-paragraph">Compile printing function for a vacant but named kind</span><span class="named-paragraph-number">32.3.25</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_26" class="named-paragraph-link"><span class="named-paragraph">Compile printing function for a vacant but named kind</span><span class="named-paragraph-number">32.3.26</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Kinds::Behaviour::is_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) &amp;&amp; (</span><a href="2-sc.html#SP1" class="function-link"><span class="function-syntax">RTShowmeCommand::needed_for_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_28" class="named-paragraph-link"><span class="named-paragraph">Apply SHOWME function metadata</span><span class="named-paragraph-number">32.3.28</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_29" class="named-paragraph-link"><span class="named-paragraph">Compile SHOWME function</span><span class="named-paragraph-number">32.3.29</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_29" class="named-paragraph-link"><span class="named-paragraph">Apply SHOWME function metadata</span><span class="named-paragraph-number">32.3.29</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_30" class="named-paragraph-link"><span class="named-paragraph">Compile SHOWME function</span><span class="named-paragraph-number">32.3.30</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="5-kc.html#SP20" class="function-link"><span class="function-syntax">RTKindConstructors::GPR_compilation_enabled</span></a><span class="plain-syntax">()) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="5-kc.html#SP21" class="function-link"><span class="function-syntax">RTKindConstructors::GPR_provided_by_kit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_an_enumeration</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_30" class="named-paragraph-link"><span class="named-paragraph">Compile enumeration GPR</span><span class="named-paragraph-number">32.3.30</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_31" class="named-paragraph-link"><span class="named-paragraph">Compile enumeration GPR</span><span class="named-paragraph-number">32.3.31</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_quasinumerical</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_31" class="named-paragraph-link"><span class="named-paragraph">Compile quasinumerical GPR</span><span class="named-paragraph-number">32.3.31</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-kc.html#SP32_3_32" class="named-paragraph-link"><span class="named-paragraph">Compile quasinumerical GPR</span><span class="named-paragraph-number">32.3.32</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre>
@ -1561,7 +1562,16 @@ and <span class="extract"><span class="extract-syntax">b</span></span> inclusive
<span class="plain-syntax"> (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">SB</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_18" class="paragraph-anchor"></a><b>&#167;32.3.18. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply long-block-size function metadata</span><span class="named-paragraph-number">32.3.18</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_18" class="paragraph-anchor"></a><b>&#167;32.3.18. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply long-block-size metadata</span><span class="named-paragraph-number">32.3.18</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">LB</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::Behaviour::get_long_block_size</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LB</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><a href="2-hrr.html#SP23" class="function-link"><span class="function-syntax">Hierarchy::apply_metadata_from_number</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="constant-syntax">KIND_LONG_BLOCK_SIZE_MD_HL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">LB</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_19" class="paragraph-anchor"></a><b>&#167;32.3.19. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply long-block-size function metadata</span><span class="named-paragraph-number">32.3.19</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1569,7 +1579,7 @@ and <span class="extract"><span class="extract-syntax">b</span></span> inclusive
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) </span><a href="2-hrr.html#SP23" class="function-link"><span class="function-syntax">Hierarchy::apply_metadata_from_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="constant-syntax">KIND_LONG_BLOCK_SIZE_FN_MD_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_19" class="paragraph-anchor"></a><b>&#167;32.3.19. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply serialise function metadata</span><span class="named-paragraph-number">32.3.19</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_20" class="paragraph-anchor"></a><b>&#167;32.3.20. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply serialise function metadata</span><span class="named-paragraph-number">32.3.20</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1577,7 +1587,7 @@ and <span class="extract"><span class="extract-syntax">b</span></span> inclusive
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) </span><a href="2-hrr.html#SP23" class="function-link"><span class="function-syntax">Hierarchy::apply_metadata_from_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="constant-syntax">KIND_SERIALISE_FN_MD_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_20" class="paragraph-anchor"></a><b>&#167;32.3.20. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply unserialise function metadata</span><span class="named-paragraph-number">32.3.20</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_21" class="paragraph-anchor"></a><b>&#167;32.3.21. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply unserialise function metadata</span><span class="named-paragraph-number">32.3.21</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1585,7 +1595,7 @@ and <span class="extract"><span class="extract-syntax">b</span></span> inclusive
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) </span><a href="2-hrr.html#SP23" class="function-link"><span class="function-syntax">Hierarchy::apply_metadata_from_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="constant-syntax">KIND_UNSERIALISE_FN_MD_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_21" class="paragraph-anchor"></a><b>&#167;32.3.21. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply comparison function metadata</span><span class="named-paragraph-number">32.3.21</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_22" class="paragraph-anchor"></a><b>&#167;32.3.22. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply comparison function metadata</span><span class="named-paragraph-number">32.3.22</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1594,7 +1604,7 @@ and <span class="extract"><span class="extract-syntax">b</span></span> inclusive
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"kind with no comparison function"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_22" class="paragraph-anchor"></a><b>&#167;32.3.22. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply make-default-value function metadata</span><span class="named-paragraph-number">32.3.22</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_23" class="paragraph-anchor"></a><b>&#167;32.3.23. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply make-default-value function metadata</span><span class="named-paragraph-number">32.3.23</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1602,7 +1612,7 @@ and <span class="extract"><span class="extract-syntax">b</span></span> inclusive
<span class="plain-syntax"> </span><a href="2-hrr.html#SP23" class="function-link"><span class="function-syntax">Hierarchy::apply_metadata_from_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pack</span><span class="plain-syntax">, </span><span class="constant-syntax">KIND_MKDEF_FN_MD_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_23" class="paragraph-anchor"></a><b>&#167;32.3.23. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile make-default-value function</span><span class="named-paragraph-number">32.3.23</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_24" class="paragraph-anchor"></a><b>&#167;32.3.24. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile make-default-value function</span><span class="named-paragraph-number">32.3.24</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1628,7 +1638,7 @@ and <span class="extract"><span class="extract-syntax">b</span></span> inclusive
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_24" class="paragraph-anchor"></a><b>&#167;32.3.24. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply printing function metadata</span><span class="named-paragraph-number">32.3.24</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_25" class="paragraph-anchor"></a><b>&#167;32.3.25. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply printing function metadata</span><span class="named-paragraph-number">32.3.25</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1639,13 +1649,13 @@ and <span class="extract"><span class="extract-syntax">b</span></span> inclusive
<span class="plain-syntax"> </span><span class="identifier-syntax">printing_rule_name</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_25" class="paragraph-anchor"></a><b>&#167;32.3.25. </b>A slightly bogus printing function first. If the source text declares a kind
<p class="commentary firstcommentary"><a id="SP32_3_26" class="paragraph-anchor"></a><b>&#167;32.3.26. </b>A slightly bogus printing function first. If the source text declares a kind
but never gives any enumerated values or literal patterns, then such values will
never appear at run-time; but we need the printing routine to exist to avoid
compilation errors.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile printing function for a vacant but named kind</span><span class="named-paragraph-number">32.3.25</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile printing function for a vacant but named kind</span><span class="named-paragraph-number">32.3.26</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1663,12 +1673,12 @@ compilation errors.
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_26" class="paragraph-anchor"></a><b>&#167;32.3.26. </b>A unit is printed back with its earliest-defined literal pattern used as
<p class="commentary firstcommentary"><a id="SP32_3_27" class="paragraph-anchor"></a><b>&#167;32.3.27. </b>A unit is printed back with its earliest-defined literal pattern used as
notation. If it had no literal patterns, it would come out as decimal numbers,
but at present this can't happen.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile printing function for a unit kind</span><span class="named-paragraph-number">32.3.26</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile printing function for a unit kind</span><span class="named-paragraph-number">32.3.27</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1687,7 +1697,7 @@ but at present this can't happen.
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_27" class="paragraph-anchor"></a><b>&#167;32.3.27. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile printing function for an enumerated kind</span><span class="named-paragraph-number">32.3.27</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_28" class="paragraph-anchor"></a><b>&#167;32.3.28. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile printing function for an enumerated kind</span><span class="named-paragraph-number">32.3.28</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1744,7 +1754,7 @@ but at present this can't happen.
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_28" class="paragraph-anchor"></a><b>&#167;32.3.28. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply SHOWME function metadata</span><span class="named-paragraph-number">32.3.28</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_29" class="paragraph-anchor"></a><b>&#167;32.3.29. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply SHOWME function metadata</span><span class="named-paragraph-number">32.3.29</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1753,7 +1763,7 @@ but at present this can't happen.
<span class="plain-syntax"> </span><span class="constant-syntax">KIND_SHOWME_MD_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_29" class="paragraph-anchor"></a><b>&#167;32.3.29. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile SHOWME function</span><span class="named-paragraph-number">32.3.29</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_30" class="paragraph-anchor"></a><b>&#167;32.3.30. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile SHOWME function</span><span class="named-paragraph-number">32.3.30</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1761,7 +1771,7 @@ but at present this can't happen.
<span class="plain-syntax"> </span><a href="2-sc.html#SP2" class="function-link"><span class="function-syntax">RTShowmeCommand::compile_kind_showme_fn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_30" class="paragraph-anchor"></a><b>&#167;32.3.30. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile enumeration GPR</span><span class="named-paragraph-number">32.3.30</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_31" class="paragraph-anchor"></a><b>&#167;32.3.31. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile enumeration GPR</span><span class="named-paragraph-number">32.3.31</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1770,7 +1780,7 @@ but at present this can't happen.
<span class="plain-syntax"> </span><span class="identifier-syntax">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="7-kg.html#SP5" class="function-link"><span class="function-syntax">KindGPRs::enumeration_agent</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">STORE_POINTER_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">), </span><span class="identifier-syntax">desc</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-kc.html#SP32_3">&#167;32.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP32_3_31" class="paragraph-anchor"></a><b>&#167;32.3.31. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile quasinumerical GPR</span><span class="named-paragraph-number">32.3.31</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP32_3_32" class="paragraph-anchor"></a><b>&#167;32.3.32. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile quasinumerical GPR</span><span class="named-paragraph-number">32.3.32</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">

View file

@ -117,7 +117,7 @@ like variables. That's what makes them intermediate.)
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">invented</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindIDs::weak_iname</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">RTKindIDs::weak_iname</span></span>:<br/><a href="5-ki.html#SP2">&#167;2</a>, <a href="5-ki.html#SP6">&#167;6</a>, <a href="5-ki.html#SP9_1">&#167;9.1</a><br/>Emit Code - <a href="2-ec.html#SP9">&#167;9</a><br/>The Heap - <a href="2-th.html#SP6">&#167;6</a><br/>Short Names - <a href="2-sn.html#SP4_1">&#167;4.1</a><br/>Kind Constructors - <a href="5-kc.html#SP32_3_25">&#167;32.3.25</a><br/>Command Grammar Tokens - <a href="7-cgt.html#SP1_2_1">&#167;1.2.1</a>, <a href="7-cgt.html#SP1_2_2">&#167;1.2.2</a>, <a href="7-cgt.html#SP1_2_3">&#167;1.2.3</a>, <a href="7-cgt.html#SP1_2_4">&#167;1.2.4</a>, <a href="7-cgt.html#SP1_2_5">&#167;1.2.5</a>, <a href="7-cgt.html#SP1_2_6">&#167;1.2.6</a>, <a href="7-cgt.html#SP1_2_7">&#167;1.2.7</a>, <a href="7-cgt.html#SP1_2_9">&#167;1.2.9</a>, <a href="7-cgt.html#SP1_2_10_2_1">&#167;1.2.10.2.1</a>, <a href="7-cgt.html#SP1_2_10_2_2">&#167;1.2.10.2.2</a><br/>Parse Name Properties - <a href="7-pnp.html#SP8">&#167;8</a>, <a href="7-pnp.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKindIDs::weak_iname</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">RTKindIDs::weak_iname</span></span>:<br/><a href="5-ki.html#SP2">&#167;2</a>, <a href="5-ki.html#SP6">&#167;6</a>, <a href="5-ki.html#SP9_1">&#167;9.1</a><br/>Emit Code - <a href="2-ec.html#SP9">&#167;9</a><br/>The Heap - <a href="2-th.html#SP6">&#167;6</a><br/>Short Names - <a href="2-sn.html#SP4_1">&#167;4.1</a><br/>Kind Constructors - <a href="5-kc.html#SP32_3_26">&#167;32.3.26</a><br/>Command Grammar Tokens - <a href="7-cgt.html#SP1_2_1">&#167;1.2.1</a>, <a href="7-cgt.html#SP1_2_2">&#167;1.2.2</a>, <a href="7-cgt.html#SP1_2_3">&#167;1.2.3</a>, <a href="7-cgt.html#SP1_2_4">&#167;1.2.4</a>, <a href="7-cgt.html#SP1_2_5">&#167;1.2.5</a>, <a href="7-cgt.html#SP1_2_6">&#167;1.2.6</a>, <a href="7-cgt.html#SP1_2_7">&#167;1.2.7</a>, <a href="7-cgt.html#SP1_2_9">&#167;1.2.9</a>, <a href="7-cgt.html#SP1_2_10_2_1">&#167;1.2.10.2.1</a>, <a href="7-cgt.html#SP1_2_10_2_2">&#167;1.2.10.2.2</a><br/>Parse Name Properties - <a href="7-pnp.html#SP8">&#167;8</a>, <a href="7-pnp.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-kc.html#SP6" class="function-link"><span class="function-syntax">RTKindConstructors::weak_ID_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">CON_UNKNOWN</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>

View file

@ -1685,7 +1685,7 @@ sets the <span class="extract"><span class="extract-syntax">parsed_number</span>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Printing the I6 variable |value| out in an LP's notation at run-time. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTLiteralPatterns::printing_routine</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">RTLiteralPatterns::printing_routine</span></span>:<br/>Kind Constructors - <a href="5-kc.html#SP32_3_26">&#167;32.3.26</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">literal_pattern</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lp_list</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTLiteralPatterns::printing_routine</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">RTLiteralPatterns::printing_routine</span></span>:<br/>Kind Constructors - <a href="5-kc.html#SP32_3_27">&#167;32.3.27</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">literal_pattern</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lp_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Functions::begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">literal_pattern_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lpn</span><span class="plain-syntax">;</span>

View file

@ -147,7 +147,7 @@ kind, trying each possible notation in turn until one matches:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindGPRs::quasinumerical_agent</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">KindGPRs::quasinumerical_agent</span></span>:<br/>Kind Constructors - <a href="5-kc.html#SP32_3_31">&#167;32.3.31</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindGPRs::quasinumerical_agent</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">KindGPRs::quasinumerical_agent</span></span>:<br/>Kind Constructors - <a href="5-kc.html#SP32_3_32">&#167;32.3.32</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_quasinumerical</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"miscall"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="5-kc.html#SP21" class="function-link"><span class="function-syntax">RTKindConstructors::GPR_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
@ -234,7 +234,7 @@ kind, trying each possible notation in turn until one matches:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindGPRs::enumeration_agent</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">KindGPRs::enumeration_agent</span></span>:<br/>Kind Constructors - <a href="5-kc.html#SP32_3_30">&#167;32.3.30</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">KindGPRs::enumeration_agent</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">KindGPRs::enumeration_agent</span></span>:<br/>Kind Constructors - <a href="5-kc.html#SP32_3_31">&#167;32.3.31</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_an_enumeration</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"miscall"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="7-kg.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Compile the normal GPR</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>

View file

@ -1,28 +1,28 @@
Total memory consumption was 140059K = 137 MB
Total memory consumption was 140603K = 137 MB
---- was used for 2135443 objects, in 376012 frames in 0 x 800K = 0K = 0 MB:
---- was used for 2144648 objects, in 379838 frames in 0 x 800K = 0K = 0 MB:
30.1% inter_tree_node_array 60 x 8192 = 491520 objects, 43255680 bytes
19.4% text_stream_array 4958 x 100 = 495800 objects, 27923456 bytes
17.9% linked_list 45908 objects, 25708480 bytes
10.0% inter_symbol_array 135 x 1024 = 138240 objects, 14381280 bytes
9.6% inter_error_stash_array 106 x 1024 = 108544 objects, 13897024 bytes
7.4% parse_node 133914 objects, 10713120 bytes
5.3% verb_conjugation 164 objects, 7610912 bytes
4.0% parse_node_annotation_array 358 x 500 = 179000 objects, 5739456 bytes
3.1% scan_directory 1092 objects, 4507776 bytes
30.0% inter_tree_node_array 60 x 8192 = 491520 objects, 43255680 bytes
19.5% text_stream_array 5001 x 100 = 500100 objects, 28165632 bytes
18.1% linked_list 46710 objects, 26157600 bytes
9.9% inter_symbol_array 135 x 1024 = 138240 objects, 14381280 bytes
9.7% inter_error_stash_array 107 x 1024 = 109568 objects, 14028128 bytes
7.4% parse_node 133919 objects, 10713520 bytes
6.6% scan_directory 2332 objects, 9626496 bytes
5.2% verb_conjugation 164 objects, 7610912 bytes
3.9% parse_node_annotation_array 358 x 500 = 179000 objects, 5739456 bytes
2.4% pcalc_prop_array 26 x 1000 = 26000 objects, 3536832 bytes
2.2% inter_name_array 68 x 1000 = 68000 objects, 3266176 bytes
1.8% kind_array 68 x 1000 = 68000 objects, 2722176 bytes
1.5% inter_schema_token 14189 objects, 2156728 bytes
1.4% inter_schema_token 14189 objects, 2156728 bytes
1.4% inter_name_generator_array 52 x 1000 = 52000 objects, 2081664 bytes
1.3% package_request 21375 objects, 1881000 bytes
1.2% vocabulary_entry_array 164 x 100 = 16400 objects, 1842048 bytes
1.1% dict_entry_array 503 x 100 = 50300 objects, 1625696 bytes
1.0% inter_symbols_table 26966 objects, 1510096 bytes
1.1% dict_entry_array 504 x 100 = 50400 objects, 1628928 bytes
1.0% inter_symbols_table 26981 objects, 1510936 bytes
1.0% match_trie_array 11 x 1000 = 11000 objects, 1496352 bytes
1.0% i6_schema_array 24 x 100 = 2400 objects, 1440768 bytes
0.9% inter_package 26966 objects, 1294368 bytes
0.8% inter_package 26981 objects, 1295088 bytes
0.7% map_data 682 objects, 1145760 bytes
0.7% id_body 981 objects, 1122264 bytes
0.7% adjective_meaning 210 objects, 1039920 bytes
@ -36,15 +36,15 @@ Total memory consumption was 140059K = 137 MB
0.3% local_variable_array 49 x 100 = 4900 objects, 471968 bytes
0.2% verb_usage 1148 objects, 394912 bytes
0.2% rule 478 objects, 374752 bytes
0.2% dictionary 7775 objects, 373200 bytes
0.2% dictionary 7797 objects, 374256 bytes
0.2% verb_form 388 objects, 350752 bytes
0.2% noun 2396 objects, 287520 bytes
0.1% noun 2396 objects, 287520 bytes
0.1% compilation_subtask 3392 objects, 271360 bytes
0.1% inference_subject 677 objects, 265384 bytes
0.1% inter_annotation_array 2 x 8192 = 16384 objects, 262208 bytes
0.1% vanilla_function 3835 objects, 245440 bytes
0.1% vanilla_function 3842 objects, 245888 bytes
0.1% binary_predicate 334 objects, 176352 bytes
0.1% hierarchy_location 1222 objects, 175968 bytes
0.1% hierarchy_location 1223 objects, 176112 bytes
0.1% linguistic_stock_item 3341 objects, 160368 bytes
0.1% rule_family_data 404 objects, 148672 bytes
---- nonterminal 773 objects, 142232 bytes
@ -56,7 +56,7 @@ Total memory consumption was 140059K = 137 MB
---- inter_schema 1546 objects, 111312 bytes
---- imperative_defn 1419 objects, 102168 bytes
---- noun_usage 2421 objects, 96840 bytes
---- inter_tree 7 objects, 96208 bytes
---- inter_tree 7 objects, 96264 bytes
---- anl_entry_array 2 x 1000 = 2000 objects, 96064 bytes
---- label_namespace 1480 objects, 94720 bytes
---- preposition 274 objects, 87680 bytes
@ -66,12 +66,14 @@ Total memory consumption was 140059K = 137 MB
---- kind_constructor 80 objects, 71680 bytes
---- spatial_data 682 objects, 65472 bytes
---- linked_list_item_array 4 x 1000 = 4000 objects, 64128 bytes
---- actions_rcd_data 1962 objects, 62784 bytes
---- scenes_rcd_data 1962 objects, 62784 bytes
---- actions_rcd_data 1962 objects, 62784 bytes
---- booking 868 objects, 62496 bytes
---- kind_macro_definition 9 objects, 62280 bytes
---- filename 1489 objects, 59560 bytes
---- response_message 408 objects, 58752 bytes
---- command_grammar 130 objects, 58240 bytes
---- pathname 1423 objects, 56920 bytes
---- table 7 objects, 56672 bytes
---- pcalc_func_array 1 x 1000 objects, 56032 bytes
---- cg_token 619 objects, 54472 bytes
@ -83,8 +85,8 @@ Total memory consumption was 140059K = 137 MB
---- heading 211 objects, 47264 bytes
---- to_family_data 528 objects, 42240 bytes
---- text_substitution 438 objects, 42048 bytes
---- activity_list_array 1 x 1000 objects, 40032 bytes
---- anl_clause_array 1 x 1000 objects, 40032 bytes
---- activity_list_array 1 x 1000 objects, 40032 bytes
---- shared_variable_access_list_array 12 x 100 = 1200 objects, 38784 bytes
---- parsing_data 682 objects, 38192 bytes
---- production_list 627 objects, 35112 bytes
@ -93,57 +95,55 @@ Total memory consumption was 140059K = 137 MB
---- property_permission 97 objects, 31816 bytes
---- stack_frame_box 307 objects, 29472 bytes
---- verb_sense 407 objects, 29304 bytes
---- filename 706 objects, 28240 bytes
---- action_pattern_array 7 x 100 = 700 objects, 28224 bytes
---- pathname 663 objects, 26520 bytes
---- parse_node_tree 32 objects, 27904 bytes
---- shared_variable_set_array 6 x 100 = 600 objects, 24192 bytes
---- parse_node_tree 27 objects, 23544 bytes
---- property 150 objects, 22800 bytes
---- backdrops_data 682 objects, 21824 bytes
---- inter_node_list 654 objects, 20928 bytes
---- nonlocal_variable 94 objects, 20304 bytes
---- pipeline_step 15 objects, 20280 bytes
---- action_name 90 objects, 20160 bytes
---- JSON_value 229 objects, 20152 bytes
---- method 416 objects, 19968 bytes
---- build_vertex 163 objects, 19560 bytes
---- timed_rules_rfd_data 404 objects, 19392 bytes
---- build_vertex 158 objects, 18960 bytes
---- instance 162 objects, 18144 bytes
---- pcalc_prop_deferral 86 objects, 17888 bytes
---- to_phrase_request 63 objects, 17136 bytes
---- understanding_reference_array 2 x 100 = 200 objects, 16064 bytes
---- action_name_list_array 1 x 1000 objects, 16032 bytes
---- match_avinue_array 1 x 1000 objects, 16032 bytes
---- action_name_list_array 1 x 1000 objects, 16032 bytes
---- adjective 142 objects, 15904 bytes
---- md_doc_state 3 objects, 15720 bytes
---- JSON_value 174 objects, 15312 bytes
---- booking_list 407 objects, 13024 bytes
---- adjective_iname_holder 325 objects, 13000 bytes
---- web_bibliographic_datum 203 objects, 12992 bytes
---- uniqueness_count 494 objects, 11856 bytes
---- uniqueness_count 495 objects, 11880 bytes
---- inter_construct 32 objects, 11008 bytes
---- heading_tree 32 objects, 9984 bytes
---- stopwatch_timer 124 objects, 9920 bytes
---- heading_tree 27 objects, 8424 bytes
---- inbuild_work 124 objects, 7936 bytes
---- inbuild_work 139 objects, 8896 bytes
---- inbuild_copy 64 objects, 7680 bytes
---- equation_node 68 objects, 7616 bytes
---- understanding_item_array 3 x 100 = 300 objects, 7296 bytes
---- shared_variable_array 1 x 100 objects, 7232 bytes
---- determiner 22 objects, 7216 bytes
---- inbuild_copy 59 objects, 7080 bytes
---- verb 109 objects, 6976 bytes
---- hierarchy_attachment_point 79 objects, 6952 bytes
---- inbuild_edition 95 objects, 6840 bytes
---- text_literal_holder 170 objects, 6800 bytes
---- inbuild_edition 85 objects, 6120 bytes
---- section_md 63 objects, 6048 bytes
---- build_script 158 objects, 5056 bytes
---- inform_extension 31 objects, 5952 bytes
---- compatibility_specification 109 objects, 5232 bytes
---- build_script 163 objects, 5216 bytes
---- activity 35 objects, 5040 bytes
---- inform_extension 26 objects, 4992 bytes
---- value_property_data 88 objects, 4928 bytes
---- semver_range 47 objects, 4888 bytes
---- explicit_action_array 1 x 100 objects, 4832 bytes
---- compatibility_specification 99 objects, 4752 bytes
---- parsing_pp_data 97 objects, 4656 bytes
---- method_set 144 objects, 4608 bytes
---- command_line_switch 56 objects, 4480 bytes
---- semver_range 42 objects, 4368 bytes
---- use_option 31 objects, 4216 bytes
---- parse_node_annotation_type 126 objects, 4032 bytes
---- either_or_property_data 62 objects, 3968 bytes
@ -158,17 +158,17 @@ Total memory consumption was 140059K = 137 MB
---- local_parking_lot 64 objects, 2560 bytes
---- parentage_inference_data 79 objects, 2528 bytes
---- part_of_inference_data 79 objects, 2528 bytes
---- kind_constructor_casting_rule_array 1 x 100 objects, 2432 bytes
---- kind_constructor_instance_rule_array 1 x 100 objects, 2432 bytes
---- kind_constructor_casting_rule_array 1 x 100 objects, 2432 bytes
---- equation_symbol 30 objects, 2400 bytes
---- scene 1 object, 2352 bytes
---- build_step 28 objects, 2016 bytes
---- pronoun_usage 42 objects, 1680 bytes
---- compiler_feature 30 objects, 1680 bytes
---- inbuild_requirement 42 objects, 1680 bytes
---- pronoun_usage 42 objects, 1680 bytes
---- table_contribution_array 1 x 100 objects, 1632 bytes
---- markdown_feature 33 objects, 1584 bytes
---- inform_pipeline 24 objects, 1536 bytes
---- inbuild_requirement 37 objects, 1480 bytes
---- noun_filter_token 22 objects, 1408 bytes
---- inter_node_array 35 objects, 1400 bytes
---- special_meaning_holder 35 objects, 1400 bytes
@ -264,16 +264,16 @@ Total memory consumption was 140059K = 137 MB
100.0% was used for memory not allocated for objects:
62.4% text stream storage 89606536 bytes in 516009 claims
3.8% dictionary storage 5512768 bytes in 7775 claims
---- sorting 2624 bytes in 531 claims
62.6% text stream storage 90147324 bytes in 520271 claims
3.8% dictionary storage 5524032 bytes in 7797 claims
---- sorting 5888 bytes in 1333 claims
5.0% source text 7200000 bytes in 3 claims
7.5% source text details 10800000 bytes in 2 claims
0.1% documentation fragments 262144 bytes in 1 claim
---- linguistic stock array 81920 bytes in 2 claims
---- small word set array 105600 bytes in 22 claims
3.1% inter symbols storage 4585504 bytes in 28334 claims
11.6% inter bytecode storage 16759620 bytes in 15 claims
3.1% inter symbols storage 4587424 bytes in 28349 claims
11.6% inter bytecode storage 16759792 bytes in 15 claims
4.3% inter links storage 6222976 bytes in 11 claims
0.1% inter tree location list storage 191232 bytes in 32 claims
1.2% instance-of-kind counting 1758276 bytes in 1 claim
@ -282,5 +282,5 @@ Total memory consumption was 140059K = 137 MB
---- code generation workspace for objects 3536 bytes in 19 claims
0.2% emitter array storage 290048 bytes in 2074 claims
-136.-7% was overhead - -196070808 bytes = -191475K = -186 MB
-140.-3% was overhead - -202096528 bytes = -197359K = -192 MB

View file

@ -1,28 +1,28 @@
100.0% in inform7 run
67.5% in compilation to Inter
45.9% in //Sequence::undertake_queued_tasks//
4.2% in //MajorNodes::pre_pass//
3.4% in //MajorNodes::pass_1//
1.9% in //ImperativeDefinitions::assess_all//
1.5% in //RTKindConstructors::compile//
1.5% in //RTPhrasebook::compile_entries//
1.1% in //Sequence::lint_inter//
67.3% in compilation to Inter
45.7% in //Sequence::undertake_queued_tasks//
4.3% in //MajorNodes::pre_pass//
3.6% in //MajorNodes::pass_1//
1.8% in //ImperativeDefinitions::assess_all//
1.4% in //RTKindConstructors::compile//
1.4% in //RTPhrasebook::compile_entries//
1.0% in //Sequence::lint_inter//
0.7% in //ImperativeDefinitions::compile_first_block//
0.3% in //CompletionModule::compile//
0.3% in //ImperativeDefinitions::compile_first_block//
0.3% in //MajorNodes::pass_2//
0.3% in //Sequence::undertake_queued_tasks//
0.3% in //Sequence::undertake_queued_tasks//
0.3% in //World::stage_V//
5.4% not specifically accounted for
27.4% in running Inter pipeline
8.8% in step 14/15: generate inform6 -> auto.inf
5.1% not specifically accounted for
27.1% in running Inter pipeline
8.7% in step 14/15: generate inform6 -> auto.inf
6.9% in step 5/15: load-binary-kits
5.7% in step 6/15: make-synoptic-module
1.9% in step 9/15: make-identifiers-unique
5.8% in step 6/15: make-synoptic-module
1.8% in step 9/15: make-identifiers-unique
0.3% in step 12/15: eliminate-redundant-operations
0.3% in step 4/15: compile-splats
0.3% in step 7/15: shorten-wiring
0.3% in step 8/15: detect-indirect-calls
2.4% not specifically accounted for
3.8% in supervisor
1.2% not specifically accounted for
2.2% not specifically accounted for
5.1% in supervisor
0.4% not specifically accounted for

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "Architecture16Kit",
"version": "10.2.0-beta+6X46"
"version": "10.2.0-beta+6X47"
},
"compatibility": "16-bit",
"kit-details": {

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "Architecture32Kit",
"version": "10.2.0-beta+6X46"
"version": "10.2.0-beta+6X47"
},
"compatibility": "32-bit",
"kit-details": {

View file

@ -101,16 +101,20 @@ the long block.
=
Constant BLK_BVBITMAP = $ff;
Constant BLK_BVUSERBITMAP = $0f;
Constant BLK_BVBITMAP_LONGBLOCK = $10; ! Word 1 of SB is pointer to LB
Constant BLK_BVBITMAP_TEXT = $20; ! BV holds a TEXT_TY value
Constant BLK_BVBITMAP_CONSTANT = $40; ! BV holds a TEXT_TY value
Constant BLK_BVBITMAP_CONSTANT = $40; ! BV holds a constant value
Constant BLK_BVBITMAP_SBONLY = $80; ! No LB, and kind ID is in word 1 of SB
#IFTRUE WORDSIZE == 4;
Constant BLK_BVBITMAP_USERBITMAPMASK = $fffffff0;
Constant BLK_BVBITMAP_LONGBLOCKMASK = $ffffff10;
Constant BLK_BVBITMAP_TEXTMASK = $ffffff20;
Constant BLK_BVBITMAP_CONSTANTMASK = $ffffff40;
#IFNOT;
Constant BLK_BVBITMAP_USERBITMAPMASK = $fff0;
Constant BLK_BVBITMAP_LONGBLOCKMASK = $ff10;
Constant BLK_BVBITMAP_TEXTMASK = $ff20;
Constant BLK_BVBITMAP_CONSTANTMASK = $ff40;
@ -145,6 +149,7 @@ which have no long block: we must use the bitmap instead.
if (o == 0) return bv-->(BLK_HEADER_KOV+1);
if (o & BLK_BVBITMAP == o) {
if (o & BLK_BVBITMAP_TEXT) return TEXT_TY;
if (o & BLK_BVBITMAP_SBONLY) return KindWeakID(bv-->1);
o = bv-->1;
}
return o-->BLK_HEADER_KOV;
@ -190,12 +195,13 @@ go downwards that we have to worry about whether something happens.
}
return refc;
}
if ((bv-->0) & BLK_BVBITMAP_SBONLY) return 0;
return RC_INFINITY;
];
@h Long Block Capacity.
As we've seen, the long block has some metadata in a header, but otherwise
it's organised as if it were an array, with entries 8, 16 or 32 bits wide.
it's organised as if it were an array, with byte or word-sized entries.
At any given time, the "capacity" of the LB is the number of entries in
this array: that doesn't mean that the BV is using them all at any given moment.
@ -687,8 +693,9 @@ here's where.
from_long_block = BlkValueGetLongBlock(from_bv);
if (from_long_block) {
if (recycling) BlkValueRecyclePrimitive(to_bv, kind);
extent_fn = ReadKindMetadata(kind, LONG_BLOCK_SIZE_FN_KMF);
if (extent_fn) no_entries_to_copy = extent_fn(from_bv);
extent_fn = ReadKindMetadata(kind, LONG_BLOCK_SIZE_KMF);
if (extent_fn ofclass Routine) no_entries_to_copy = extent_fn(from_bv);
else extent_fn = no_entries_to_copy;
if (no_entries_to_copy <= 0) no_entries_to_copy = BlkValueLBCapacity(from_bv);
BlkValueMassCopyEntries(to_bv, from_bv, no_entries_to_copy);
}
@ -708,7 +715,6 @@ otherwise we go ahead and make one.
#ifdef LKTRACE_HEAP;
print "Copy: ", (BlkValueDebug) to_bv, " to equal ", (BlkValueDebug) from_bv, "^";
#endif;
to_kind = BlkValueWeakKind(to_bv);
from_kind = BlkValueWeakKind(from_bv);
if (to_kind ~= from_kind) BlkValueError("copy incompatible kinds");
@ -716,6 +722,8 @@ otherwise we go ahead and make one.
quick_copy_fn = ReadKindMetadata(to_kind, QUICK_COPY_FN_KMF);
if ((quick_copy_fn) && (quick_copy_fn(to_bv, from_bv) == false))
BlkValueSlowCopyPrimitive(to_bv, from_bv, to_kind, true);
else if (to_bv-->0 & BLK_BVBITMAP_SBONLY)
BlkValueSlowCopyPrimitive(to_bv, from_bv, to_kind, true);
else
BlkValueQuickCopyPrimitive(to_bv, from_bv, to_kind);
return to_bv;
@ -861,7 +869,7 @@ work first time, so it turned out to be useful to have these routines on hand.
refc = BlkValueGetRefCountPrimitive(bv);
if (refc == RC_INFINITY) print " resident";
else { print " ", refc, " ref"; if (refc ~= 1) print "s"; }
}
} else if ((bv-->0) & BLK_BVBITMAP_SBONLY) print "SBO";
print " = "; SayKindValuePair(BlkValueWeakKind(bv), bv);
if (BlkValueWeakKind(bv) == TEXT_TY) TEXT_TY_Debug(bv);
}

View file

@ -29,7 +29,7 @@ Thus, a triple $(x, y, z)$ uses 4 words.
[ COMBINATION_TY_Create kind sb_address
short_block long_block N i bk v;
N = KindConstructorArity(kind);
long_block = CreatePVLongBlock(COMBINATION_ITEM_BASE+N, COMBINATION_TY);
long_block = CreatePVLongBlockFlexible(COMBINATION_TY, COMBINATION_ITEM_BASE + N);
InitialisePVLongBlockField(long_block, COMBINATION_KIND_F, kind);
for (i=0: i<N: i++) {
bk = KindConstructorTerm(kind, i);
@ -38,7 +38,7 @@ Thus, a triple $(x, y, z)$ uses 4 words.
InitialisePVLongBlockField(long_block, COMBINATION_ITEM_BASE+i, v);
}
short_block = CreatePVShortBlock(sb_address, 1);
short_block = CreatePVShortBlock(sb_address, kind);
short_block-->0 = long_block;
return short_block;

View file

@ -69,7 +69,7 @@ Constant DESTROY_FN_KMF = 12;
Constant MAKE_MUTABLE_FN_KMF = 13;
Constant HASH_FN_KMF = 14;
Constant SHORT_BLOCK_SIZE_KMF = 15;
Constant LONG_BLOCK_SIZE_FN_KMF = 16;
Constant LONG_BLOCK_SIZE_KMF = 16;
Constant SERIALISE_FN_KMF = 17;
Constant UNSERIALISE_FN_KMF = 18;
@ -278,12 +278,52 @@ Constant WeakKindOfPV = BlkValueWeakKind;
Constant PVField = BlkValueReadSB;
Constant WritePVField = BlkValueWriteSB;
Constant CreatePVLongBlock = BlkValueCreateLB;
Constant CreatePVLongBlockMultiple = BlkValueCreateMultipleLB;
Constant InitialisePVLongBlockField = BlkValueWriteLB;
Constant PVLongBlockField = BlkValueReadLB;
Constant CreatePVShortBlock = BlkValueCreateSB;
Constant SBONLYPV_FIELDS = 2;
[ CreatePVShortBlock sb_address kind_id
short_block size;
size = ReadKindMetadata(kind_id, SHORT_BLOCK_SIZE_KMF);
short_block = BlkValueCreateSB(sb_address, size);
if (ReadKindMetadata(kind_id, LONG_BLOCK_SIZE_KMF) == 0) {
short_block-->0 = BLK_BVBITMAP_SBONLY;
short_block-->1 = kind_id;
}
return short_block;
];
[ CreatePVLongBlock kind_id size;
if (size <= 0) {
size = ReadKindMetadata(kind_id, LONG_BLOCK_SIZE_KMF);
if (size ofclass Routine) {
BlkValueError("CreatePVLongBlock needs a size");
size = 8;
}
}
return BlkValueCreateLB(size, kind_id);
];
[ CreatePVLongBlockFlexible kind_id size;
if (size <= 0) {
BlkValueError("CreatePVLongBlockFlexible needs a size");
size = 8;
}
return BlkValueCreateMultipleLB(size, kind_id);
];
[ KindOfShortBlockOnlyPV bv;
return bv-->1;
];
[ ShortBlockOnlyPVFlags bv;
return (bv-->0) & BLK_BVUSERBITMAP;
];
[ WriteShortBlockOnlyPVFlags bv flags;
bv-->0 = ((bv-->0) & BLK_BVBITMAP_USERBITMAPMASK) + (flags & BLK_BVUSERBITMAP);
];
Constant CopyPVShortBlock = BlkValueCopySB;
Constant CopyPVRawData = BlkValueCopyRawLongBlock;
@ -300,3 +340,4 @@ Constant SetPVFieldCapacity = BlkValueSetLBCapacity;
Constant DestroyPVFromStack = BlkValueFreeOnStack;
Constant CreatePVOnStack = BlkValueCreateOnStack;

View file

@ -24,12 +24,12 @@ list metadata entries below.
=
[ LIST_OF_TY_Create kind_id sb_address
short_block long_block;
long_block = CreatePVLongBlockMultiple(27, LIST_OF_TY);
long_block = CreatePVLongBlockFlexible(kind_id, 27);
InitialisePVLongBlockField(long_block, LIST_ITEM_KOV_F,
KindConstructorTerm(kind_id, 0));
InitialisePVLongBlockField(long_block, LIST_LENGTH_F, 0);
short_block = CreatePVShortBlock(sb_address, 1);
short_block = CreatePVShortBlock(sb_address, kind_id);
short_block-->0 = long_block;
return short_block;

View file

@ -184,7 +184,7 @@ newly constructed data structure which can grow freely from here.
=
[ RELATION_TY_Create kind_id sb_address from
short_block long_block i handler;
long_block = CreatePVLongBlockMultiple(RRV_DATA_BASE + 3*RRP_MIN_SIZE, RELATION_TY);
long_block = CreatePVLongBlockFlexible(kind_id, RRV_DATA_BASE + 3*RRP_MIN_SIZE);
if ((from == 0) && (kind_id)) from = DefaultValueFinder(kind_id);
if (from) {
for (i=0: i<RRV_DATA_BASE: i++) InitialisePVLongBlockField(long_block, i, PVField(from, i));
@ -212,12 +212,21 @@ newly constructed data structure which can grow freely from here.
InitialisePVLongBlockField(long_block, RRV_FILLED, 0);
}
short_block = CreatePVShortBlock(sb_address, 1);
short_block = CreatePVShortBlock(sb_address, kind_id);
short_block-->0 = long_block;
return short_block;
];
@h Extent.
We need to provide an explicit function for this, even though we only say the
answer is "use the capacity".
=
[ RELATION_TY_LongBlockSize rel;
return 0;
];
@h Destruction.
If the relation stores block values on either side, invoke the handler using a special task
value to free the memory associated with them.

View file

@ -90,7 +90,7 @@ A newly created text is a two-word short block with no long block, like this:
=
[ TEXT_TY_Create kind_id sb_address
short_block;
short_block = CreatePVShortBlock(sb_address, 2);
short_block = CreatePVShortBlock(sb_address, kind_id);
short_block-->0 = PACKED_TEXT_STORAGE;
short_block-->1 = EMPTY_TEXT_PACKED;
return short_block;

View file

@ -77,8 +77,8 @@ builtin base TEXT_TY {
plural: texts
default-value: 0
multiple-block: yes
heap-size-estimate: 256
flexible-long-block-size: 200
long-block-size-function: TEXT_TY_LongBlockSize
short-block-size: 2
can-exchange: yes
constant-compilation-method: special
@ -95,7 +95,6 @@ builtin base TEXT_TY {
unserialise-function: TEXT_TY_Unserialise
copy-function: TEXT_TY_Copy
copy-short-block-function: TEXT_TY_CopyShortBlock
long-block-size-function: TEXT_TY_LongBlockSize
index-default-value: ""
specification-text: Some text in double quotation marks, perhaps with substitutions written in square brackets.
@ -254,9 +253,8 @@ builtin constructor RELATION_TY {
terms: covariant, covariant
default-value: 0
multiple-block: yes
short-block-size: 1
heap-size-estimate: 8
flexible-long-block-size: 8
long-block-size-function: RELATION_TY_LongBlockSize
can-exchange: yes
constant-compilation-method: special
@ -325,9 +323,8 @@ builtin constructor LIST_OF_TY {
terms: covariant
default-value: 0
multiple-block: yes
short-block-size: 1
heap-size-estimate: 256
flexible-long-block-size: 200
long-block-size-function: LIST_OF_TY_LongBlockSize
can-exchange: yes
constant-compilation-method: special
@ -339,7 +336,6 @@ builtin constructor LIST_OF_TY {
quick-copy-function: LIST_OF_TY_QuickCopy
destroy-function: LIST_OF_TY_Destroy
hash-function: LIST_OF_TY_Hash
long-block-size-function: LIST_OF_TY_LongBlockSize
documentation-reference: kind_listof
index-default-value: { }
@ -387,9 +383,7 @@ builtin constructor COMBINATION_TY {
terms: covariant list, covariant list
default-value: 0
multiple-block: yes
short-block-size: 1
heap-size-estimate: 256
flexible-long-block-size: 8
can-exchange: yes
constant-compilation-method: special

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "BasicInformKit",
"version": "10.2.0-beta+6X46"
"version": "10.2.0-beta+6X47"
},
"needs": [ {
"need": {

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "CommandParserKit",
"version": "10.2.0-beta+6X46"
"version": "10.2.0-beta+6X47"
},
"needs": [ {
"need": {

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "EnglishLanguageKit",
"version": "10.2.0-beta+6X46"
"version": "10.2.0-beta+6X47"
},
"needs": [ {
"need": {

View file

@ -39,7 +39,7 @@ in which the player waits.
=
[ STORED_ACTION_TY_Create kind_id sb_address
short_block long_block;
long_block = CreatePVLongBlock(6, STORED_ACTION_TY);
long_block = CreatePVLongBlock(STORED_ACTION_TY);
InitialisePVLongBlockField(long_block, STORA_ACTION_F, ##Wait);
InitialisePVLongBlockField(long_block, STORA_NOUN_F, 0);
InitialisePVLongBlockField(long_block, STORA_SECOND_F, 0);
@ -47,7 +47,7 @@ in which the player waits.
InitialisePVLongBlockField(long_block, STORA_REQUEST_F, false);
InitialisePVLongBlockField(long_block, STORA_COMMAND_TEXT_F, 0);
short_block = CreatePVShortBlock(sb_address, 1);
short_block = CreatePVShortBlock(sb_address, kind_id);
short_block-->0 = long_block;
return short_block;

View file

@ -15,9 +15,7 @@ new base STORED_ACTION_TY {
plural: actions
comparison-schema: DESCRIPTION_OF_ACTION_TY>>>*=-((STORED_ACTION_TY_Adopt(*1), (SAT_Tmp-->0=(*2)), STORED_ACTION_TY_Unadopt()))
multiple-block: no
short-block-size: 1
heap-size-estimate: 16
long-block-size: 6
can-exchange: yes
constant-compilation-method: special
@ -26,7 +24,7 @@ new base STORED_ACTION_TY {
compare-function: STORED_ACTION_TY_Compare
create-function: STORED_ACTION_TY_Create
copy-function: STORED_ACTION_TY_Copy
long-block-size-function: STORED_ACTION_TY_LongBlockSize
! long-block-size-function: STORED_ACTION_TY_LongBlockSize
destroy-function: STORED_ACTION_TY_Destroy
hash-function: STORED_ACTION_TY_Hash

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "WorldModelKit",
"version": "10.2.0-beta+6X46"
"version": "10.2.0-beta+6X47"
},
"needs": [ {
"need": {

View file

@ -0,0 +1,7 @@
Title: CMYKColoursKit
Author: Graham Nelson
Purpose: Support for the example CMYK Colours extension.
Language: Inform 6
Sections
CMYK Colours

View file

@ -0,0 +1,84 @@
CMYK Colours
The functions needed for CMYK colour support.
@ See "Writing with Inform" for details.
=
Constant CMYK_NAME_F = 0;
Constant CMYK_CYAN_F = 1;
Constant CMYK_MAGENTA_F = 2;
Constant CMYK_YELLOW_F = 3;
Constant CMYK_BLACK_F = 4;
[ CMYK_COLOUR_TY_Say cmyk;
TEXT_TY_Say(PVField(cmyk, CMYK_NAME_F));
print " ink = ";
print "C:", PVField(cmyk, CMYK_CYAN_F), "% ";
print "M:", PVField(cmyk, CMYK_MAGENTA_F), "% ";
print "Y:", PVField(cmyk, CMYK_YELLOW_F), "% ";
print "K:", PVField(cmyk, CMYK_BLACK_F), "%";
];
[ CMYK_COLOUR_TY_Compare cmyk1 cmyk2 i d;
d = TEXT_TY_Compare(PVField(cmyk1, CMYK_NAME_F), PVField(cmyk2, CMYK_NAME_F));
if (d ~= 0) return d;
for (i=CMYK_CYAN_F: i<=CMYK_BLACK_F: i++) {
d = PVField(cmyk1, i) - PVField(cmyk2, i);
if (d ~= 0) return d;
}
return 0;
];
[ CMYK_COLOUR_TY_Hash cmyk rv;
rv = TEXT_TY_Hash(PVField(cmyk, CMYK_NAME_F));
rv = rv * 33 + PVField(cmyk, CMYK_CYAN_F);
rv = rv * 33 + PVField(cmyk, CMYK_MAGENTA_F);
rv = rv * 33 + PVField(cmyk, CMYK_YELLOW_F);
rv = rv * 33 + PVField(cmyk, CMYK_BLACK_F);
return rv;
];
Array CMYK_DEFAULT_NAME_TEXT --> PACKED_TEXT_STORAGE "black";
[ CMYK_COLOUR_TY_Create kind_id sb_address
short_block long_block txt;
long_block = CreatePVLongBlock(kind_id);
txt = CreatePV(TEXT_TY);
CopyPV(txt, CMYK_DEFAULT_NAME_TEXT);
TEXT_TY_Mutable(txt);
InitialisePVLongBlockField(long_block, CMYK_NAME_F, txt);
InitialisePVLongBlockField(long_block, CMYK_CYAN_F, 0);
InitialisePVLongBlockField(long_block, CMYK_MAGENTA_F, 0);
InitialisePVLongBlockField(long_block, CMYK_YELLOW_F, 0);
InitialisePVLongBlockField(long_block, CMYK_BLACK_F, 100);
short_block = CreatePVShortBlock(sb_address, kind_id);
short_block-->0 = long_block;
return short_block;
];
[ CMYK_COLOUR_TY_Destroy cmyk;
DestroyPV(PVField(cmyk, CMYK_NAME_F));
];
[ CMYK_COLOUR_TY_New ink c m y k cmyk;
cmyk = CreatePV(CMYK_COLOUR_TY);
CopyPV(PVField(cmyk, CMYK_NAME_F), ink);
WritePVField(cmyk, CMYK_CYAN_F, c);
WritePVField(cmyk, CMYK_MAGENTA_F, m);
WritePVField(cmyk, CMYK_YELLOW_F, y);
WritePVField(cmyk, CMYK_BLACK_F, k);
return cmyk;
];
[ CMYK_COLOUR_TY_Copy cmykto cmykfrom kind recycling
inkfrom inkto;
CopyPVRawData(cmykto, cmykfrom, kind, recycling);
inkfrom = PVField(cmykfrom, CMYK_NAME_F);
inkto = CreatePV(TEXT_TY);
CopyPV(inkto, inkfrom);
WritePVField(cmykto, CMYK_NAME_F, inkto);
];

View file

@ -0,0 +1,22 @@
new base CMYK_COLOUR_TY {
conforms-to: POINTER_VALUE_TY
conforms-to: SAYABLE_VALUE_TY
singular: CMYK colour
plural: CMYK colours
long-block-size: 5
can-exchange: yes
constant-compilation-method: none
say-function: CMYK_COLOUR_TY_Say
compare-function: CMYK_COLOUR_TY_Compare
create-function: CMYK_COLOUR_TY_Create
copy-function: CMYK_COLOUR_TY_Copy
destroy-function: CMYK_COLOUR_TY_Destroy
hash-function: CMYK_COLOUR_TY_Hash
index-priority: 2
index-default-value: 0
specification-text: A cyan-magenta-yellow-black description of an ink colour.
}

View file

@ -0,0 +1,10 @@
{
"is": {
"type": "kit",
"title": "CMYKColoursKit",
"version": "1"
},
"kit-details": {
"provides-kinds": [ "CMYKColours.neptune" ]
}
}

View file

@ -0,0 +1,6 @@
Version 1 of CMYK Colours by Graham Nelson begins here.
To decide which CMYK colour is (T - text) ink C (C - number) M (M - number) Y (Y - number) K (K - number):
(- (CMYK_COLOUR_TY_New({T}, {C}, {M}, {Y}, {K})) -).
CMYK Colours ends here.

View file

@ -0,0 +1,14 @@
{
"is": {
"type": "extension",
"title": "CMYK Colours",
"author": "Graham Nelson",
"version": "1"
},
"needs": [ {
"need": {
"type": "kit",
"title": "CMYKColoursKit"
}
} ]
}

View file

@ -0,0 +1,7 @@
Title: CountryCodesKit
Author: Graham Nelson
Purpose: Support for the example Country Codes extension.
Language: Inform 6
Sections
Country Codes

View file

@ -0,0 +1,3 @@
Country Codes
In fact no support is needed.

View file

@ -0,0 +1,10 @@
new base COUNTRY_CODE_TY {
conforms-to: ENUMERATED_VALUE_TY
singular: country code
plural: country codes
instance: Saint Helena code = ST_HELENA_CC = 290
instance: New Caledonia code = NEW_CALEDONIA_CC = 687
instance: Montserrat code = MONTSERRAT_CC = 1664
instance: Svalbard code = SVALBARD_CC = 4779
}

View file

@ -0,0 +1,10 @@
{
"is": {
"type": "kit",
"title": "CountryCodesKit",
"version": "1"
},
"kit-details": {
"provides-kinds": [ "CountryCodes.neptune" ]
}
}

View file

@ -0,0 +1,3 @@
Version 1 of Country Codes by Graham Nelson begins here.
Country Codes ends here.

View file

@ -0,0 +1,14 @@
{
"is": {
"type": "extension",
"title": "Country Codes",
"author": "Graham Nelson",
"version": "1"
},
"needs": [ {
"need": {
"type": "kit",
"title": "CountryCodesKit"
}
} ]
}

View file

@ -0,0 +1,7 @@
Title: MemoryAddressesKit
Author: Graham Nelson
Purpose: Support for the example Memory Addresses extension.
Language: Inform 6
Sections
Memory Addresses

View file

@ -0,0 +1,60 @@
Memory Addresses
The functions needed for "memory address" support.
@ See "Writing with Inform" for details.
=
[ MEMORY_ADDRESS_TY_SAY N;
print "$";
#iftrue (WORDSIZE == 2);
PrintInBase(N, 16, 4);
#ifnot;
PrintInBase(N, 16, 8);
#endif;
];
[ MEMORY_ADDRESS_TY_ShowBytes N C
i;
for (i=0: i<C: i++) {
if (i > 0) print " ";
PrintInBase(N->i, 16, 2);
}
print " ~";
for (i=0: i<C: i++) {
if ((N->i >= $20) && (N->i < $7f)) print (char) N->i; else print "?";
}
print "~";
];
[ MEMORY_ADDRESS_TY_TOKEN wa wl ch n digit;
wa = WordAddress(wn);
wl = WordLength(wn);
#Iftrue CHARSIZE == 1;
ch = wa->0;
if (wl > 5) return DECIMAL_TOKEN();
#Ifnot;
ch = wa-->0;
if (wl > 9) return DECIMAL_TOKEN();
#Endif; ! CHARSIZE
if (ch ~= '$') return DECIMAL_TOKEN();
wa = wa + CHARSIZE;
wl--;
n = 0;
while (wl > 0) {
#Iftrue CHARSIZE == 1;
ch = wa->0;
#Ifnot;
ch = wa-->0;
#Endif; ! CHARSIZE
if (ch >= 'a') digit = ch - 'a' + 10;
else if (ch >= 'A') digit = ch - 'A' + 10;
else digit = ch - '0';
if (digit >= 0 && digit < 16) n = 16*n + digit;
else return GPR_FAIL;
wl--;
wa = wa + CHARSIZE;
}
parsed_number = n; wn++;
return GPR_NUMBER;
];

View file

@ -0,0 +1,17 @@
new base MEMORY_ADDRESS_TY {
conforms-to: ARITHMETIC_VALUE_TY
singular: memory address
plural: memory addresses
default-value: 0
can-exchange: yes
constant-compilation-method: none
compare-function: UnsignedCompare
understand-function: MEMORY_ADDRESS_TY_TOKEN
say-function: MEMORY_ADDRESS_TY_SAY
index-priority: 2
index-default-value: 0
specification-text: An address within the virtual machine the story runs in.
}

View file

@ -0,0 +1,10 @@
{
"is": {
"type": "kit",
"title": "MemoryAddressesKit",
"version": "1"
},
"kit-details": {
"provides-kinds": [ "MemoryAddresses.neptune" ]
}
}

View file

@ -0,0 +1,30 @@
Version 1 of Memory Addresses by Graham Nelson begins here.
Section 1 - General Support
To decide which memory address is (N - number) byte/bytes:
(- {N} -).
To decide which memory address is (N - number) in memory:
(- {N} -).
To decide which memory address is the address of the serial code:
(- (VM_SerialNumber()) -).
To say dump of (N - number) bytes at (address - memory address):
(- MEMORY_ADDRESS_TY_SAY({address});
print ": ";
MEMORY_ADDRESS_TY_ShowBytes({address}, {N});
-);
Section 2 - Dump Command (not for release)
Dumping memory at is an action out of world applying to one memory address.
Carry out dumping memory at:
say dump of 32 bytes at the memory address understood;
say line break.
Understand "dump [memory address]" as dumping memory at.
Memory Addresses ends here.

View file

@ -0,0 +1,14 @@
{
"is": {
"type": "extension",
"title": "Memory Addresses",
"author": "Graham Nelson",
"version": "1"
},
"needs": [ {
"need": {
"type": "kit",
"title": "MemoryAddressesKit"
}
} ]
}

View file

@ -0,0 +1,7 @@
Title: OptionalsKit
Author: Graham Nelson
Purpose: Support for the example Optionals extension.
Language: Inform 6
Sections
Optionals

View file

@ -0,0 +1,108 @@
Optionals
The functions needed for "optional K" support.
@ See "Writing with Inform" for details.
=
Constant OPTIONAL_CONTENT_SF = SBONLYPV_FIELDS + 0;
Constant OPTIONAL_TY_NO_VALUE_SBF = 1;
[ OPTIONAL_TY_Say opt scalar_kind_id;
if (ShortBlockOnlyPVFlags(opt, 0) & OPTIONAL_TY_NO_VALUE_SBF) {
print "no value";
} else {
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(opt), 0);
SayKindValuePair(scalar_kind_id, opt-->OPTIONAL_CONTENT_SF);
}
];
[ OPTIONAL_TY_Compare opt1 opt2 scalar_kind_id;
if (ShortBlockOnlyPVFlags(opt1, 0) & OPTIONAL_TY_NO_VALUE_SBF) {
if (ShortBlockOnlyPVFlags(opt2, 0) & OPTIONAL_TY_NO_VALUE_SBF) return 0;
return -1;
}
if (ShortBlockOnlyPVFlags(opt2, 0) & OPTIONAL_TY_NO_VALUE_SBF) return 1;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(opt1), 0);
return CompareKindValuePairs(
scalar_kind_id, opt1-->OPTIONAL_CONTENT_SF,
scalar_kind_id, opt2-->OPTIONAL_CONTENT_SF);
];
[ OPTIONAL_TY_Create kind_id sb_address
short_block scalar_kind_id;
scalar_kind_id = KindConstructorTerm(kind_id, 0);
short_block = CreatePVShortBlock(sb_address, kind_id);
WriteShortBlockOnlyPVFlags(short_block, OPTIONAL_TY_NO_VALUE_SBF);
short_block-->OPTIONAL_CONTENT_SF = 0;
return short_block;
];
[ OPTIONAL_TY_Destroy opt scalar_kind_id;
if (ShortBlockOnlyPVFlags(opt, 0) & OPTIONAL_TY_NO_VALUE_SBF) return;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(opt), 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id))
DestroyPV(opt-->OPTIONAL_CONTENT_SF);
];
[ OPTIONAL_TY_QuickCopy optto optfrom kind;
rfalse;
];
[ OPTIONAL_TY_Copy optto optfrom scalar_kind_id;
if (ShortBlockOnlyPVFlags(optfrom, 0) & OPTIONAL_TY_NO_VALUE_SBF) {
if (ShortBlockOnlyPVFlags(optto, 0) & OPTIONAL_TY_NO_VALUE_SBF == 0) {
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(optto), 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id))
DestroyPV(optto-->OPTIONAL_CONTENT_SF);
optto-->OPTIONAL_CONTENT_SF = 0;
WriteShortBlockOnlyPVFlags(optto, OPTIONAL_TY_NO_VALUE_SBF);
}
} else {
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(optto), 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
if (ShortBlockOnlyPVFlags(optto, 0) & OPTIONAL_TY_NO_VALUE_SBF)
optto-->OPTIONAL_CONTENT_SF = CreatePV(scalar_kind_id);
CopyPV(optto-->OPTIONAL_CONTENT_SF, optfrom-->OPTIONAL_CONTENT_SF);
} else {
optto-->OPTIONAL_CONTENT_SF = optfrom-->OPTIONAL_CONTENT_SF;
}
WriteShortBlockOnlyPVFlags(optto, 0);
}
return false;
];
[ OPTIONAL_TY_Wrap opt x scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(opt), 0);
WriteShortBlockOnlyPVFlags(opt, 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
if (opt-->OPTIONAL_CONTENT_SF == 0)
opt-->OPTIONAL_CONTENT_SF = CreatePV(scalar_kind_id);
CopyPV(opt-->OPTIONAL_CONTENT_SF, x);
} else {
opt-->OPTIONAL_CONTENT_SF = x;
}
return opt;
];
[ OPTIONAL_TY_Exists opt;
if (ShortBlockOnlyPVFlags(opt, 0) & OPTIONAL_TY_NO_VALUE_SBF)
rfalse;
rtrue;
];
[ OPTIONAL_TY_Unwrap val opt scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(opt), 0);
if (ShortBlockOnlyPVFlags(opt, 0) & OPTIONAL_TY_NO_VALUE_SBF) {
BlkValueError("unwrapped an optional value with no value");
val = KindDefaultValue(scalar_kind_id);
}
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
CopyPV(val, opt-->OPTIONAL_CONTENT_SF);
} else {
val = opt-->OPTIONAL_CONTENT_SF;
}
return val;
];

View file

@ -0,0 +1,19 @@
new constructor OPTIONAL_TY {
conforms-to: POINTER_VALUE_TY
conforms-to: SAYABLE_VALUE_TY
singular: optional k
plural: optional k
terms: covariant
short-block-size: 1
say-function: OPTIONAL_TY_Say
compare-function: OPTIONAL_TY_Compare
create-function: OPTIONAL_TY_Create
copy-function: OPTIONAL_TY_Copy
destroy-function: OPTIONAL_TY_Destroy
index-priority: 2
index-default-value: 0
specification-text: A way to hold either a value, or a "no value" alternative.
}

View file

@ -0,0 +1,10 @@
{
"is": {
"type": "kit",
"title": "OptionalsKit",
"version": "1"
},
"kit-details": {
"provides-kinds": [ "Optionals.neptune" ]
}
}

View file

@ -0,0 +1,12 @@
Version 1 of Optionals by Graham Nelson begins here.
To decide which optional K is (X - value of kind K) as optional:
(- (OPTIONAL_TY_Wrap({-new: optional K}, {X})) -).
To decide if (X - optional value) exists:
(- (OPTIONAL_TY_Exists({-by-reference:X})) -).
To decide which K is (X - optional value of kind K) as value:
(- (OPTIONAL_TY_Unwrap({-new: K}, {-by-reference:X})) -).
Optionals ends here.

View file

@ -0,0 +1,14 @@
{
"is": {
"type": "extension",
"title": "Optionals",
"author": "Graham Nelson",
"version": "1"
},
"needs": [ {
"need": {
"type": "kit",
"title": "OptionalsKit"
}
} ]
}

View file

@ -0,0 +1,8 @@
Title: VectorsKit
Author: Graham Nelson
Purpose: Support for the example Vectors extension.
Language: Inform 6
Sections
Vector
Vector Of

View file

@ -0,0 +1,88 @@
Vector Of
The functions needed for "vector of K" support.
@ See "Writing with Inform" for details.
=
Constant VECTOR_OF_X_SF = SBONLYPV_FIELDS + 0;
Constant VECTOR_OF_Y_SF = SBONLYPV_FIELDS + 1;
Constant VECTOR_OF_Z_SF = SBONLYPV_FIELDS + 2;
[ VECTOR_OF_TY_Say vec scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(vec), 0);
print "(";
SayKindValuePair(scalar_kind_id, vec-->VECTOR_OF_X_SF);
print ",";
SayKindValuePair(scalar_kind_id, vec-->VECTOR_OF_Y_SF);
print ",";
SayKindValuePair(scalar_kind_id, vec-->VECTOR_OF_Z_SF);
print ")";
];
[ VECTOR_OF_TY_Compare vec1 vec2 n1 n2 i d scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(vec1), 0);
for (i=VECTOR_OF_X_SF: i<=VECTOR_OF_Z_SF: i++) {
d = CompareKindValuePairs(scalar_kind_id, vec1-->i, scalar_kind_id, vec2-->i);
if (d ~= 0) return d;
}
return 0;
];
[ VECTOR_OF_TY_Create kind_id sb_address
short_block scalar_kind_id;
scalar_kind_id = KindConstructorTerm(kind_id, 0);
short_block = CreatePVShortBlock(sb_address, kind_id);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
short_block-->VECTOR_OF_X_SF = CreatePV(scalar_kind_id);
short_block-->VECTOR_OF_Y_SF = CreatePV(scalar_kind_id);
short_block-->VECTOR_OF_Z_SF = CreatePV(scalar_kind_id);
} else {
short_block-->VECTOR_OF_X_SF = KindDefaultValue(scalar_kind_id);
short_block-->VECTOR_OF_Y_SF = short_block-->VECTOR_OF_X_SF;
short_block-->VECTOR_OF_Z_SF = short_block-->VECTOR_OF_X_SF;
}
return short_block;
];
[ VECTOR_OF_TY_Destroy vec scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(vec), 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
DestroyPV(vec-->VECTOR_OF_X_SF);
DestroyPV(vec-->VECTOR_OF_Y_SF);
DestroyPV(vec-->VECTOR_OF_Z_SF);
}
];
[ VECTOR_OF_TY_Copy vecto vecfrom scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(vecto), 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
CopyPV(vecto-->VECTOR_OF_X_SF, vecfrom-->VECTOR_OF_X_SF);
CopyPV(vecto-->VECTOR_OF_Y_SF, vecfrom-->VECTOR_OF_Y_SF);
CopyPV(vecto-->VECTOR_OF_Z_SF, vecfrom-->VECTOR_OF_Z_SF);
} else {
vecto-->VECTOR_OF_X_SF = vecfrom-->VECTOR_OF_X_SF;
vecto-->VECTOR_OF_Y_SF = vecfrom-->VECTOR_OF_Y_SF;
vecto-->VECTOR_OF_Z_SF = vecfrom-->VECTOR_OF_Z_SF;
}
return false;
];
[ VECTOR_OF_TY_Fill vec x y z scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(vec), 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
CopyPV(vec-->VECTOR_OF_X_SF, x);
CopyPV(vec-->VECTOR_OF_Y_SF, y);
CopyPV(vec-->VECTOR_OF_Z_SF, z);
} else {
vec-->VECTOR_OF_X_SF = x;
vec-->VECTOR_OF_Y_SF = y;
vec-->VECTOR_OF_Z_SF = z;
}
return vec;
];

View file

@ -0,0 +1,49 @@
Vector
The functions needed for "vector" support.
@ See "Writing with Inform" for details.
=
Constant VECTOR_X_SF = SBONLYPV_FIELDS + 0;
Constant VECTOR_Y_SF = SBONLYPV_FIELDS + 1;
Constant VECTOR_Z_SF = SBONLYPV_FIELDS + 2;
[ VECTOR_TY_Say vec;
print "(", vec-->VECTOR_X_SF, ",", vec-->VECTOR_Y_SF, ",", vec-->VECTOR_Z_SF, ")";
];
[ VECTOR_TY_Compare vec1 vec2 n1 n2 i j d;
for (i=VECTOR_X_SF: i<=VECTOR_Z_SF: i++) {
d = vec1-->i - vec2-->i;
if (d ~= 0) return d;
}
return 0;
];
[ VECTOR_TY_Create kind_id sb_address
short_block;
short_block = CreatePVShortBlock(sb_address, kind_id);
short_block-->VECTOR_X_SF = 0;
short_block-->VECTOR_Y_SF = 0;
short_block-->VECTOR_Z_SF = 0;
return short_block;
];
[ VECTOR_TY_Copy vecto vecfrom;
vecto-->VECTOR_X_SF = vecfrom-->VECTOR_X_SF;
vecto-->VECTOR_Y_SF = vecfrom-->VECTOR_Y_SF;
vecto-->VECTOR_Z_SF = vecfrom-->VECTOR_Z_SF;
return false;
];
[ VECTOR_TY_Fill vec x y z;
vec-->VECTOR_X_SF = x;
vec-->VECTOR_Y_SF = y;
vec-->VECTOR_Z_SF = z;
return vec;
];

View file

@ -0,0 +1,37 @@
new base VECTOR_TY {
conforms-to: POINTER_VALUE_TY
conforms-to: SAYABLE_VALUE_TY
singular: vector
plural: vectors
short-block-size: 3
say-function: VECTOR_TY_Say
compare-function: VECTOR_TY_Compare
create-function: VECTOR_TY_Create
copy-function: VECTOR_TY_Copy
index-priority: 2
index-default-value: 0
specification-text: A vector with three number-valued coordinates.
}
new constructor VECTOR_OF_TY {
conforms-to: POINTER_VALUE_TY
conforms-to: SAYABLE_VALUE_TY
singular: vector of k
plural: vectors of k
terms: covariant
short-block-size: 3
say-function: VECTOR_OF_TY_Say
compare-function: VECTOR_OF_TY_Compare
create-function: VECTOR_OF_TY_Create
copy-function: VECTOR_OF_TY_Copy
destroy-function: VECTOR_OF_TY_Destroy
index-priority: 2
index-default-value: 0
specification-text: A vector with three coordinates having the kind K.
}

View file

@ -0,0 +1,10 @@
{
"is": {
"type": "kit",
"title": "VectorsKit",
"version": "1"
},
"kit-details": {
"provides-kinds": [ "Vectors.neptune" ]
}
}

View file

@ -0,0 +1,9 @@
Version 1 of Vectors by Graham Nelson begins here.
To decide which vector is vector x (X - number) y (Y - number) z (Z - number):
(- (VECTOR_TY_Fill({-new: vector}, {X}, {Y}, {Z})) -).
To decide which vector of K is vector x (X - value of kind K) y (Y - K) z (Z - K):
(- (VECTOR_OF_TY_Fill({-new: vector of K}, {X}, {Y}, {Z})) -).
Vectors ends here.

View file

@ -0,0 +1,14 @@
{
"is": {
"type": "extension",
"title": "Vectors",
"author": "Graham Nelson",
"version": "1"
},
"needs": [ {
"need": {
"type": "kit",
"title": "VectorsKit"
}
} ]
}

View file

@ -1,3 +1,16 @@
ValueDomainList
ListSetEmpty
PhraseTokenSpecificAction
PhraseDescriptionFilter
RelevantRelations
CactusWillOutliveUsAll
NarrativeRegister
Robo2
CountryCodes
CMYKColours
MemoryAddresses
Optionals
Vectors
PM_DimensionRedundant
PM_DimensionNotBaseKOV
PM_NonDimensional

View file

@ -0,0 +1,18 @@
"background" = cmyk colour: black ink = C:0% M:0% Y:0% K:100%
""lavender" ink C 8 M 8 Y 0 K 2" = cmyk colour: lavender ink = C:8% M:8% Y:0% K:2%
"royal blue" = cmyk colour: royal blue ink = C:71% M:53% Y:0% K:12%
"whether or not royal blue is greater than background" = truth state: true
Before sorting, L is royal blue ink = C:71% M:53% Y:0% K:12%, black ink = C:0% M:0% Y:0% K:100%, taupe ink = C:0% M:19% Y:30% K:72% and taupe ink = C:0% M:17% Y:31% K:72%.
After sorting, L is black ink = C:0% M:0% Y:0% K:100%, royal blue ink = C:71% M:53% Y:0% K:12%, taupe ink = C:0% M:17% Y:31% K:72% and taupe ink = C:0% M:19% Y:30% K:72%.
Welcome
An Interactive Fiction
Release 1 / Serial number 160428 / Inform 7 v10.2.0 / D
Reform Club
>Are you sure you want to quit?

View file

@ -0,0 +1,21 @@
Test: CMYKColours
The Reform Club is a room.
Include CMYK Colours by Graham Nelson.
When play begins:
let background be a CMYK colour;
showme background;
showme "lavender" ink C 8 M 8 Y 0 K 2;
let royal blue be "royal blue" ink C 71 M 53 Y 0 K 12;
showme royal blue;
showme whether or not royal blue is greater than background;
let L be a list of CMYK colours;
add royal blue to L;
add background to L;
add "taupe" ink C 0 M 19 Y 30 K 72 to L;
add "taupe" ink C 0 M 17 Y 31 K 72 to L;
say "Before sorting, L is [L].";
sort L;
say "After sorting, L is [L].";

View file

@ -0,0 +1,19 @@
country code: Saint Helena code
"list of country codes" = list of country codes: {Saint Helena code, New Caledonia code, Montserrat code, Svalbard code}
"a random country code" = country code: New Caledonia code
"number of country codes" = number: 4
You dial 1664
You dial 290
You dial 4779
The phone does feel a little chilly.
Welcome
An Interactive Fiction
Release 1 / Serial number 160428 / Inform 7 v10.2.0 / D
Reform Club
>Are you sure you want to quit?

View file

@ -0,0 +1,24 @@
Test: CountryCodes
The Reform Club is a room.
Include Country Codes by Graham Nelson.
When play begins:
showme the Saint Helena code;
showme the list of country codes;
showme a random country code;
showme the number of country codes;
dial the Montserrat code;
dial the Saint Helena code;
dial the Svalbard code.
To dial (code - country code):
(- Dialup({code}); -).
Include (-
[ Dialup code;
print "You dial ", code, "^";
if (code == SVALBARD_CC) print "The phone does feel a little chilly.^";
];
-).

View file

@ -0,0 +1,17 @@
"header" = memory address: $00000000
"header plus 4 bytes" = memory address: $00000004
"address of the serial code" = memory address: $00000036
Looking inside, I see $00000000: 47 6C 75 6C 00 03 01 02 00 07 24 00 00 09 22 00 00 09 22 00 00 01 00 00 00 00 00 3C 00 05 7B 78 FF BE 4F 8F 49 6E 66 6F 00 01 00 00 36 2E 34 33 30 2E 33 38 00 01 31 36 30 34 32 38 C1 00 00 30 "Glul??????$???"???"????????<??{x??O?Info????6.430.38??160428???0".
At the serial code, $00000036: 31 36 30 34 32 38 "160428".
Welcome
An Interactive Fiction
Release 1 / Serial number 160428 / Inform 7 v10.2.0 / D
Reform Club
>Are you sure you want to quit?

View file

@ -0,0 +1,13 @@
Test: MemoryAddresses
The Reform Club is a room.
Include Memory Addresses by Graham Nelson.
When play begins:
let the header be 0 in memory;
showme the header;
showme the header plus 4 bytes;
showme the address of the serial code;
say "Looking inside, I see [dump of 64 bytes at the header].";
say "At the serial code, [dump of 6 bytes at the address of the serial code].";

View file

@ -0,0 +1,20 @@
""Pie!" as optional" = optional texts: Pie!
"Q" = optional real numbers: no value
"whether or not Q exists" = truth state: false
"Q" = optional real numbers: 3.14159
"whether or not Q exists" = truth state: true
"Q as value" = real number: 3.14159
"e as optional as value" = real number: 2.71828
"first entry of { "alpha", "beta", "gamma" }" = optional texts: alpha
"first entry of L" = optional numbers: no value
Welcome
An Interactive Fiction
Release 1 / Serial number 160428 / Inform 7 v10.2.0 / D
Reform Club
>Are you sure you want to quit?

View file

@ -0,0 +1,24 @@
Test: Optional
The Reform Club is a room.
Include Optionals by Graham Nelson.
To decide which optional K is the first entry of (L - list of values of kind K):
repeat with entry running through L:
decide on the entry as optional;
let the non-entry be an optional K;
decide on the non-entry;
When play begins:
showme "Pie!" as optional;
let Q be an optional real number;
showme Q;
showme whether or not Q exists;
let Q be pi as optional;
showme Q;
showme whether or not Q exists;
showme Q as value;
showme e as optional as value;
showme the first entry of { "alpha", "beta", "gamma" }; let L be a list of numbers;
showme the first entry of L;

View file

@ -0,0 +1,19 @@
"mom" = vector: (3,14,5)
"ideal" = vector: (3,14,5)
"mom" = vector: (2,-50,200)
"ideal" = vector: (3,14,5)
"aunt" = vector of texts: (fish,snake,duck)
"perfect" = vector of texts: (fish,snake,duck)
"aunt" = vector of texts: (bat,ball,stump)
"perfect" = vector of texts: (fish,snake,duck)
Welcome
An Interactive Fiction
Release 1 / Serial number 160428 / Inform 7 v10.2.0 / D
Reform Club
>Are you sure you want to quit?

View file

@ -0,0 +1,21 @@
Test: Vectors
The Reform Club is a room.
Include Vectors by Graham Nelson.
When play begins:
let mom be vector x 3 y 14 z 5;
showme mom;
let ideal be the mom;
showme ideal;
now mom is vector x 2 y -50 z 200;
showme mom;
showme ideal;
let aunt be vector x "fish" y "snake" z "duck";
showme aunt;
let perfect be the aunt;
showme perfect;
now aunt is vector x "bat" y "ball" z "stump";
showme aunt;
showme perfect;

View file

@ -1204,6 +1204,7 @@ void Hierarchy::establish(void) {
@e KIND_MAKE_MUTABLE_FN_MD_HL
@e KIND_HASH_FN_MD_HL
@e KIND_SHORT_BLOCK_SIZE_MD_HL
@e KIND_LONG_BLOCK_SIZE_MD_HL
@e KIND_LONG_BLOCK_SIZE_FN_MD_HL
@e KIND_SERIALISE_FN_MD_HL
@e KIND_UNSERIALISE_FN_MD_HL
@ -1328,6 +1329,7 @@ void Hierarchy::establish(void) {
H_C_U(KIND_MAKE_MUTABLE_FN_MD_HL, I"^make_mutable_fn")
H_C_U(KIND_HASH_FN_MD_HL, I"^hash_fn")
H_C_U(KIND_SHORT_BLOCK_SIZE_MD_HL, I"^short_block_size")
H_C_U(KIND_LONG_BLOCK_SIZE_MD_HL, I"^long_block_size")
H_C_U(KIND_LONG_BLOCK_SIZE_FN_MD_HL, I"^long_block_size_fn")
H_C_U(KIND_SERIALISE_FN_MD_HL, I"^serialise_fn")
H_C_U(KIND_UNSERIALISE_FN_MD_HL, I"^unserialise_fn")

View file

@ -57,9 +57,9 @@ typedef struct heap_allocation {
int stack_offset;
} heap_allocation;
@ Every kind of block value can give an estimate of its likely size needs -- its
exact size needs if it is fixed in size, and a reasonable overestimate of typical
usage if it is flexible.
@ We want to make an estimate of the likely size needs of such a value if placed
on the heap -- its exact size needs if it is fixed in size, and a reasonable
overestimate of typical usage if it is flexible.
The |multiplier| is used when we need to calculate the size of, say, a list of
20 texts; it would then, of course, be 20. Any |stack_offset| is simply passed
@ -70,10 +70,14 @@ heap_allocation TheHeap::make_allocation(kind *K, int multiplier,
int stack_offset) {
if (Kinds::Behaviour::uses_block_values(K) == FALSE)
internal_error("unable to allocate heap storage for this kind of value");
if (Kinds::Behaviour::get_heap_size_estimate(K) == 0)
internal_error("no heap storage estimate for this kind of value");
total_heap_allocation += (Kinds::Behaviour::get_heap_size_estimate(K) + 8)*multiplier;
int estimate = 2 + Kinds::Behaviour::get_short_block_size(K);
if (Kinds::Behaviour::get_flexible_long_block_size(K) > 0)
estimate += Kinds::Behaviour::get_flexible_long_block_size(K);
else
estimate += Kinds::Behaviour::get_long_block_size(K);
total_heap_allocation += (estimate + 8)*multiplier;
heap_allocation ha;
ha.allocated_kind = K;

View file

@ -897,6 +897,7 @@ or can come from the Neptune file creating a kind.
@<Apply make-mutable function metadata@>;
@<Apply hash function metadata@>;
@<Apply short-block-size metadata@>;
@<Apply long-block-size metadata@>;
@<Apply long-block-size function metadata@>;
@<Apply serialise function metadata@>;
@<Apply unserialise function metadata@>;
@ -1316,6 +1317,11 @@ and |b| inclusive.
if (SB > 0) Hierarchy::apply_metadata_from_number(pack, KIND_SHORT_BLOCK_SIZE_MD_HL,
(inter_ti) SB);
@<Apply long-block-size metadata@> =
int LB = Kinds::Behaviour::get_long_block_size(K);
if (LB > 0) Hierarchy::apply_metadata_from_number(pack, KIND_LONG_BLOCK_SIZE_MD_HL,
(inter_ti) LB);
@<Apply long-block-size function metadata@> =
inter_name *iname = RTKindConstructors::long_block_size_fn_iname(K);
if (iname) Hierarchy::apply_metadata_from_iname(pack, KIND_LONG_BLOCK_SIZE_FN_MD_HL, iname);

View file

@ -181,20 +181,20 @@ text_stream *Wiring::wired_to_name(inter_symbol *S) {
Now suppose a symbol in package |X| wants to refer to a meaning which
does not yet exist, and will in fact never exist in the current tree. (It will
be linked in from another tree later on.) For example, perhaps Inform 7 is
compiling a function body which needs to refer to |PVCreate|, a function
compiling a function body which needs to refer to |CreatePV|, a function
in BasicInformKit.
This is done by having |PVCreate| in |X| wire to a special symbol called
This is done by having |CreatePV| in |X| wire to a special symbol called
a "plug" in a special package of the tree at |/main/connectors|.
(See //building: Large-Scale Structure// for more on this package.) That plug
is left dangling, in the sense that it is wired to the name |"PVCreate"|,
is left dangling, in the sense that it is wired to the name |"CreatePV"|,
but that this name is unresolved.
= (text)
MAIN TREE
+-----------------+ +--------------------------+
| Package X | | Package /main/connectors |
| | | |
| PVCreate ~~~~~~~~~~~~~~~> _plug_BlkValueCreate ~~~~~~~> "PVCreate"
| CreatePV ~~~~~~~~~~~~~~~> _plug_BlkValueCreate ~~~~~~~> "CreatePV"
+-----------------+ +--------------------------+
=
@ -204,18 +204,18 @@ Meanwhile, suppose a second tree holds //BasicInformKit//. This looks like so:
+-------------------+ +--------------------------+
| Package Y | | Package /main/connectors |
| | | |
| PVCreate <~~~~~~~~~~~~~~~~ PVCreate <~~~~~~~~~~~~~~~~~~ "PVCreate"
| CreatePV <~~~~~~~~~~~~~~~~ CreatePV <~~~~~~~~~~~~~~~~~~ "CreatePV"
| ..... | +--------------------------+
| function defn |
| of PVCreate |
| of CreatePV |
| function defn |
| of SecretFunction |
+-------------------+
=
Package |Y| in this tree holds two function definitions, let's say: |PVCreate|
Package |Y| in this tree holds two function definitions, let's say: |CreatePV|
and |SecretFunction|. The latter is private to BasicInformKit, in that the linking
process in //pipeline// does not allow symbols in other trees to be wired to it.
But |PVCreate| is available. That is because the BasicInformKit provides
But |CreatePV| is available. That is because the BasicInformKit provides
a "socket" to it.
Sockets, like plugs, live only in the |/main/connectors| package of a tree.
@ -226,25 +226,25 @@ and no socket names do.
@ The point of this is that after //Transmigration// there will be a single
tree like so, which has merged the connectors from the two original trees,
and which now contains both |X| and |Y|. We can npw connect the plug
|_plug_BlkValueCreate| with the socket |PVCreate|:
|_plug_BlkValueCreate| with the socket |CreatePV|:
= (text)
.. MERGED TREE ................................................
. +-----------------+ +--------------------------+ .
. | Package X | | Package /main/connectors | .
. | | | | .
. | PVCreate ~~~~~~~~~~~~~~> _plug_BlkValueCreate ~~~~~~~\ .
. | CreatePV ~~~~~~~~~~~~~~> _plug_BlkValueCreate ~~~~~~~\ .
. +-----------------+ | | \ .
. | | | .
. +-----------------+ | | | .
. | Package Y | | | | .
. | | | | / .
. | PVCreate <~~~~~~~~~~~~~~~ PVCreate <~~~~~~~~~~~~~~~~~/ .
. | CreatePV <~~~~~~~~~~~~~~~ CreatePV <~~~~~~~~~~~~~~~~~/ .
. | ..... | +--------------------------+ .
. | function defn | .
. +-----------------+ .
...............................................................
=
The cable end from |PVCreate| in |X| is indeed the definition in |Y|,
The cable end from |CreatePV| in |X| is indeed the definition in |Y|,
and all is well.
Some sockets may never be used -- that would be a situation where one tree
@ -256,7 +256,7 @@ up the offer. The only essential thing is that all plugs must find a socket.
(*) Every socket is always wired.
(*) Every plug is either wired to a socket, or to a name, in the hope that
it will one day be wired to a socket of that name.
(*) All uses of, say, |PVCreate| in the main tree are wired to a single
(*) All uses of, say, |CreatePV| in the main tree are wired to a single
plug in its |/main/connectors| package.
(*) By looking at the incoming count of a plug or socket, we can see if it is
still needed -- if the count falls to 0, it is not.

View file

@ -204,19 +204,22 @@ or higher is therefore that of a derived kind.
}
@<Short block size field@> =
if (Metadata::read_optional_numeric(pack, I"^short_block_size") > 0) {
inter_ti SB = Metadata::read_numeric(pack, I"^short_block_size");
Synoptic::numeric_entry(SB);
} else {
Synoptic::numeric_entry(1);
}
inter_ti SB = 1;
if (Metadata::read_optional_numeric(pack, I"^short_block_size") > 0)
SB = Metadata::read_numeric(pack, I"^short_block_size");
Synoptic::numeric_entry(SB);
@<Long block size function field@> =
if (Metadata::optional_symbol(pack, I"^long_block_size_fn")) {
inter_symbol *long_block_size_fn_s = Metadata::required_symbol(pack, I"^long_block_size_fn");
Synoptic::symbol_entry(long_block_size_fn_s);
} else {
Synoptic::numeric_entry(0);
if (Metadata::read_optional_numeric(pack, I"^long_block_size") > 0) {
inter_ti LB = Metadata::read_numeric(pack, I"^long_block_size");
Synoptic::numeric_entry(LB);
} else {
Synoptic::numeric_entry(0);
}
}
@<Serialise function field@> =

View file

@ -21569,7 +21569,6 @@ new base MEMORY_ADDRESS_TY {
default-value: 0
can-exchange: yes
constant-compilation-method: none
compare-function: UnsignedCompare
understand-function: MEMORY_ADDRESS_TY_Understand
@ -21581,28 +21580,17 @@ new base MEMORY_ADDRESS_TY {
}
```
As can be seen, though, it defines no instances — only enumerated kinds can do that — and instead sets many more details. Let's start with these three settings, which affect how the kind is handled inside the Inform compiler:
As can be seen, though, it defines no instances — only enumerated kinds can do that — and instead sets many more details. Let's start with these settings, which affect how the kind is handled inside the Inform compiler:
``` code
default-value: 0
can-exchange: yes
constant-compilation-method: none
```
* ```default-value``` gives an I6 expression for the default value for the kind. Here, that will be the address 0.
* ```can-exchange``` being ```yes``` means that values of this kind, if printed out by one story and then read in by another story entirely, would still have the same meaning. For example, that's true of `number` because all Inform stories use the same bits to represent the number 17, say. But it is not true of `action name`, because one story may have an action for `swimming`, say, and the other story not; and even if both of them have, they may number it differently. The default for ```can-exchange``` is very much ```no```, but we're saying ```yes``` here. An address means the same in all stories, even though the data stored at that address may be different in each of them.
* ```constant-compilation-method``` tells Inform how literal values of this kind are written in source text. The possible options are: ```none```, ```literal```, ```quantitative``` and ```special```, the default being ```none```:
- ```none``` means there are no literals of this kind.
- ```literal``` means there are literals of this kind, parsed using Inform's system of [Advanced Notations]. These, however, can't be used with kinds which are created in Neptune files.
- ```quantitative``` means there are named instances, as for enumerations. The word used here is now a little enigmatic, but relates to a time when instances of enumerated values were called "quantities" inside the compiler's source code.
- ```special``` means that the compiler contains special code to handle this. New kinds can't use this, of course.
Next we have some settings for how values are handled at run-time:
``` code
@ -21686,7 +21674,7 @@ This is essentially a prototype of how to write a loop over all valid values of
``` code
ActionNumberIndexed(0)
ActionNumberIndexed(2)
ActionNumberIndexed(1)
ActionNumberIndexed(2)
...
ActionNumberIndexed(AD_RECORDS - 1)
@ -21983,10 +21971,7 @@ new base CMYK_COLOUR_TY {
singular: CMYK colour
plural: CMYK colours
multiple-block: no
short-block-size: 1
long-block-size-function: CMYK_COLOUR_TY_LongBlockSize
heap-size-estimate: 8
long-block-size: 5
create-function: CMYK_COLOUR_TY_Create
say-function: CMYK_COLOUR_TY_Say
@ -21994,9 +21979,6 @@ new base CMYK_COLOUR_TY {
hash-function: CMYK_COLOUR_TY_Hash
copy-function: CMYK_COLOUR_TY_Copy
destroy-function: CMYK_COLOUR_TY_Destroy
can-exchange: yes
constant-compilation-method: none
index-priority: 2
index-default-value: 0
@ -22004,33 +21986,15 @@ new base CMYK_COLOUR_TY {
}
```
Let's look first at the second set of settings, which describe how much memory a CMYK value will consume:
Let's look first at the setting ```long-block-size: 5```. The memory used by a pointer value is normally split between a _short block_ and a _long block_. There are basically two and a half strategies for kinds to follow:
``` code
short-block-size: 1
long-block-size-function: CMYK_COLOUR_TY_LongBlockSize
multiple-block: no
heap-size-estimate: 8
```
- Put all the data in the short block, and have no long block. We'll see examples of this later. To get this, set ```short-block-size``` to the number of fields of data needed, and do not set ```long-block-size```.
Pointer values like this are represented by a pointer to a _short block_ of memory. Often, and always in the case of CMYK, this will contain a further pointer to a _long block_, where the real data is. Short blocks usually only contain 1 or 2 words of memory, so they're aptly named: this one has just 1 word, and consists only of the pointer to the long block.
- Have a 1-word short block (they're not called short for nothing) which consists only of a pointer to a long block, where the data is. This is what `CMYK colour` will do. To get this, set ```long-block-size``` to the number of fields of data needed, and do not set ```short-block-size```. If the long block needs to be able to expand or contract during use, set ```flexible-long-block-size``` to an overestimate of what is usually needed, and do not set either of the other two settings.
Long blocks can contain varying quantities of data (for example, lists and texts can expand or contract), so there's no constant ```long-block-size``` setting. Instead we have to provide a function which returns the current number of words being used...
- Have a 2-word short block and sometimes but not always have a long block as well. The `text` kind is currently the only one to do this, and it's not recommended for anything else.
``` code
Constant CMYK_LONG_BLOCK_SIZE = 5;
Constant CMYK_SHORT_BLOCK_SIZE = 1;
[ CMYK_COLOUR_TY_LongBlockSize cmyk;
return CMYK_LONG_BLOCK_SIZE;
]
```
...but it won't be very interesting: the answer is always 5.
Values of some kinds need only a fixed amount of space, so they can manage with just one long block. Others might balloon out to huge amounts of storage, occupying a chain of multiple long blocks. ```multiple-block:``` should be ```yes``` for those kinds, but ```no``` for kinds like `CMYK colour`, where our data storage needs never change.
```heap-size-estimate:``` is compulsory for pointer-valued types: it makes a guess at the likely storage needs of a typical value of this kind, rounded up to the nearest power of two. Here all values of the kind need 5 words, so 8 is the next power of two.
Note that the ```long block size``` is measured in _fields_, and we will need 5 in all: name, cyan, magenta, yellow, black.
Next we come to a whole set of functions needed for `CMYK colour` to operate:
@ -22046,6 +22010,8 @@ Next we come to a whole set of functions needed for `CMYK colour` to operate:
To start with the creation function: this will be called as ```CMYK_COLOUR_TY_Create(kind_id, sb_address)```. The long block must be created first, and then the short block, which incorporates a pointer to it, always in the last word of the short block.
``` code
Constant CMYK_LONG_BLOCK_SIZE = 5;
Constant CMYK_NAME_F = 0;
Constant CMYK_CYAN_F = 1;
Constant CMYK_MAGENTA_F = 2;
@ -22057,7 +22023,7 @@ Array CMYK_DEFAULT_NAME_TEXT --> PACKED_TEXT_STORAGE "black";
[ CMYK_COLOUR_TY_Create kind_id sb_address
short_block long_block txt;
long_block = CreatePVLongBlock(CMYK_LONG_BLOCK_SIZE, CMYK_COLOUR_TY);
long_block = CreatePVLongBlock(CMYK_COLOUR_TY);
txt = CreatePV(TEXT_TY);
CopyPV(txt, CMYK_DEFAULT_NAME_TEXT); TEXT_TY_Mutable(txt);
@ -22068,20 +22034,18 @@ Array CMYK_DEFAULT_NAME_TEXT --> PACKED_TEXT_STORAGE "black";
InitialisePVLongBlockField(long_block, CMYK_YELLOW_F, 0);
InitialisePVLongBlockField(long_block, CMYK_BLACK_F, 100);
short_block = CreatePVShortBlock(sb_address, CMYK_SHORT_BLOCK_SIZE);
short_block = CreatePVShortBlock(sb_address, kind_id);
short_block-->0 = long_block;
return short_block;
];
```
It is very important that the ```sb_address``` value is passed to ```CreatePVShortBlock```. The deal here is that if this is 0 then the short block is created somewhere in the heap, but if it is non-zero, then the short block is created at the given location (often on the stack). We don't need to care about any of that, but we do need to pass the address on.
If this kind used multiple long blocks, it would have been necessary to call ```CreatePVLongBlockMultiple``` instead of ```CreatePVLongBlock```, but otherwise the process would be exactly the same.
It is very important that the ```sb_address``` value is passed through to ```CreatePVShortBlock```. The deal here is that if this is 0 then the short block is created somewhere in the heap, but if it is non-zero, then the short block is created at the given location (often on the stack). We don't need to care about any of that, but we do need to pass the address on.
The words of actual data in the long block are called _fields_. They're indexed 0 to 4, since we're using just 5. We put initial contents into the five words with the special function ```InitialisePVLongBlockField```. Note the ```LB```, for long block, at the end of this function name, and do not confuse this function with the usual ```WritePVField```. ```InitialisePVLongBlockField``` should never be used except in create functions.
The interesting field of the five is ```CMYK_NAME_F```, of course, since it's a text value which itself needs creation. When created by ```PVCreate(TEXT_TY)```, the result will be a copy of the default text, which is the empty text `""`. We actually want to start with `"black"`, so we must _copy_ that constant value into our new text, but any use of packed text is always tricksy, and we make it mutable so that its value will sort correctly as against text. We don't simply execute ```InitialisePVLongBlockField(long_block, CMYK_NAME_F, CMYK_DEFAULT_NAME_TEXT);``` because values like text must always be copied in a way which keeps reference counts accurate.
The interesting field of the five is ```CMYK_NAME_F```, of course, since it's a text value which itself needs creation. When created by ```CreatePV(TEXT_TY)```, the result will be a copy of the default text, which is the empty text `""`. We actually want to start with `"black"`, so we must _copy_ that constant value into our new text, but any use of packed text is always tricksy, and we make it mutable so that its value will sort correctly as against text. We don't simply execute ```InitialisePVLongBlockField(long_block, CMYK_NAME_F, CMYK_DEFAULT_NAME_TEXT);``` because values like text must always be copied in a way which keeps reference counts accurate.
So here's how to say a CMYK once we have one:
@ -22152,8 +22116,7 @@ If the long block had contained only numbers, we would not even have needed to d
Purely for convenience, we're also going to provide a creation function which populates a CMYK colour with some actual values other than solid black:
``` code
[ CMYK_COLOUR_TY_New ink c m y k cmyk;
cmyk = PVCreate(CMYK_COLOUR_TY);
[ CMYK_COLOUR_TY_New cmyk ink c m y k;
CopyPV(PVField(cmyk, CMYK_NAME_F), ink);
WritePVField(cmyk, CMYK_CYAN_F, c);
WritePVField(cmyk, CMYK_MAGENTA_F, m);
@ -22163,10 +22126,10 @@ Purely for convenience, we're also going to provide a creation function which po
];
```
We can then define this phrase in the wrapper extension:
We can then define this phrase in the wrapper extension. Note that the value is actually created by `{-new:CMYK colour}` in the inline phrase definition: this is important, because it means that value will automatically be destroyed when it goes out of scope. (That would not be true if instead the ```CMYK_COLOUR_TY_New``` function had called ```CreatePV``` to make its own `CMYK colour`: that would cause a memory leak.)
To decide which CMYK colour is (T - text) ink C (C - number) M (M - number) Y (Y - number) K (K - number):
(- (CMYK_COLOUR_TY_New({T}, {C}, {M}, {Y}, {K})) -).
(- (CMYK_COLOUR_TY_New({-new:CMYK colour}, {T}, {C}, {M}, {Y}, {K})) -).
And finally, then, a project which includes the wrapper extension could have:
@ -22203,6 +22166,12 @@ Y:30% K:72%.
A number of other functions can optionally be provided in Neptune declarations, too. `CMYK colour` did not need them, but more outré kinds might.
- ```flexible-long-block-size```. Values of most kinds need only a fixed amount of space, but others can balloon out to huge amounts of storage. This may be stored internally as a chain of multiple long blocks, but all of that is hidden from us. Setting ```flexible-long-block-size: 200```, say, is an _alternative_ to setting ```long-block-size: 10```. _Do not set both._ Instead of saying that the LB will hold exactly 10 fields, we are saying that it can hold a potentially unlimited number, but that a reasonable overestimate in typical usage is about 200. (Inform uses such estimates in working out what size of memory heap a story needs.)
Flexible-long-block values need to be created slightly differently, by calling ```CreatePVLongBlockFlexible(kind_id, N)``` instead of ```CreatePVLongBlock(kind_id)```, but otherwise the process is exactly the same. Here ```N``` has to be the _initial_ field storage needed. The long block can later be resized as needed using ```SetPVFieldCapacity(value, N2)```.
- ```long-block-size-function```. This can only be provided for flexible-LB kinds, and returns the current actual usage of fields in the long block. If it returns 0, or isn't given, then the current _capacity_ is taken as being the current usage, i.e., the long block is assumed to be fully used up. This is often not the case — for example, a list holding 20 values might be using a block with 200 spare fields — so a flexible LB kind will run faster if it provides this function.
- ```make-mutable-function```. This has to do with constant values and reference-counting, and is tricky to explain. Only kinds which pull off the trick of sometimes having a long block, and sometimes not, will need this device, and at present only ```TEXT_TY``` does that. See the ```BasicInformKit``` source code (or, preferably, don't).
- ```copy-short-block-function```. Similarly obscure, and also used only by ```TEXT_TY``` at present. If provided, this function makes a non-standard copy of one short block to another. But there is a lot to be said for the standard way.
@ -22215,56 +22184,158 @@ A number of other functions can optionally be provided in Neptune declarations,
- ```serialise-function```. Writing a serialised-to-text form of the data to a file. See ```TEXT_TY_Serialise``` in ```BasicInformKit``` for an example of this.
## Neptune and short-block-only values
In this section we look at still another way to set up a base kind. Instead of having a short block which points to a long block, and putting all the data in the long block, we'll try for something a touch faster with less memory overhead: putting the data itself in the short block.
This can only work where a small amount of data is all that's needed. (In fact, `CMYK colour` would have been a good candidate for this, but never mind.) Here we'll make something very minimal: a vector of three numbers, which we can think of as x-, y- and z-coordinates.
``` code
new base VECTOR_TY {
conforms-to: POINTER_VALUE_TY
conforms-to: SAYABLE_VALUE_TY
singular: vector
plural: vectors
short-block-size: 5
long-block-size: 0
say-function: VECTOR_TY_Say
compare-function: VECTOR_TY_Compare
create-function: VECTOR_TY_Create
copy-function: VECTOR_TY_Copy
index-priority: 2
index-default-value: 0
specification-text: A three-vector which holds number values in its x, y, z coordinates.
}
```
The create function is a little different now:
``` code
Constant VECTOR_X_SF = 2;
Constant VECTOR_Y_SF = 3;
Constant VECTOR_Z_SF = 4;
[ VECTOR_TY_Create kind_id sb_address
short_block;
short_block = CreatePVShortBlock(sb_address, kind_id);
short_block-->VECTOR_X_SF = 0;
short_block-->VECTOR_Y_SF = 0;
short_block-->VECTOR_Z_SF = 0;
return short_block;
];
```
Note that the fields are read and written _directly_ from the short block, and not via the access functions ```PVField``` and ```WritePVField```. Those write data to a long block, and this kind has no long block. This is good: it's fast, for one thing.
But the responsibility for writing only in range is now entirely on us, and we can use only words 2, 3 and 4: words 0 and 1 belong to the memory manager. That's why we defined
``` code
Constant VECTOR_X_SF = 2;
Constant VECTOR_Y_SF = 3;
Constant VECTOR_Z_SF = 4;
```
and not equating these to 0, 1, 2. In fact, we get slightly more storage than this: the memory manager leaves us 4 bits free in its own two words of the short block. See [Neptune and optionals] for how these can be used: we won't need them for `vector`.
The say and compare functions are quite concise:
``` code
[ VECTOR_TY_Say vec;
print "(", vec-->VECTOR_X_SF, ",";
print vec-->VECTOR_Y_SF, ",";
print vec-->VECTOR_Z_SF, ")";
];
[ VECTOR_TY_Compare vec1 vec2 n1 n2 i j d;
d = vec1-->VECTOR_X_SF - vec2-->VECTOR_X_SF; if (d ~= 0) return d;
d = vec1-->VECTOR_Y_SF - vec2-->VECTOR_Y_SF; if (d ~= 0) return d;
d = vec1-->VECTOR_Z_SF - vec2-->VECTOR_Z_SF; if (d ~= 0) return d;
return 0;
];
```
There's no need for a destroy function at all, since the data in a vector is only ordinary `number` values which need no destruction.
The copy function is now simple:
``` code
[ VECTOR_TY_Copy vecto vecfrom;
vecto-->VECTOR_X_SF = vecfrom-->VECTOR_X_SF;
vecto-->VECTOR_Y_SF = vecfrom-->VECTOR_Y_SF;
vecto-->VECTOR_Z_SF = vecfrom-->VECTOR_Z_SF;
return false;
];
```
And that's it. Still, we want a convenience initialiser too, as with `CMYK colour`, so:
``` code
[ VECTOR_TY_New vec x y z;
vec-->VECTOR_X_SF = x;
vec-->VECTOR_Y_SF = y;
vec-->VECTOR_Z_SF = z;
return vec;
];
```
And we can then define this:
To decide which vector is vector x (X - number) y (Y - number) z (Z - number):
(- (VECTOR_TY_New({-new: vector}, {X}, {Y}, {Z})) -).
After which `vector x 10 y 12 z 20`, for example, will be said back as ``(10,12,20)``. Of course, there are lots of functions we could define for useful things to do with vectors, but the kind itself now exists.
## Neptune and kind constructors
_Kind constructors_ are ways to construct new kinds from existing ones: sometimes one existing kind, as in `list of K`, and sometimes two, as in `relation of K to L`.
These of course can make an unlimited number of different kinds — consider `list of numbers`, `list of lists of numbers`, `list of lists of lists of numbers`, ..., for example. But the different possible kinds made out of the same constructor share a Neptune declaration.
For example, here is the declaration for `list of K` in ```BasicInformKit``` (slightly shortened to remove the Index details, which work exactly as for base kinds):
Suppose, for the sake of a concrete example, that we want to make a more general version of the `vector` kind created in the previous section. It will behave exactly as `vector` did, but will be able to hold triples of any kind, and not only of `number`. The declaration is surprisingly similar:
``` code
builtin constructor LIST_OF_TY {
new constructor VECTOR_OF_TY {
conforms-to: POINTER_VALUE_TY
singular: list of k
plural: lists of k
conforms-to: SAYABLE_VALUE_TY
singular: vector of k
plural: vectors of k
terms: covariant
short-block-size: 5
long-block-size: 0
say-function: VECTOR_OF_TY_Say
compare-function: VECTOR_OF_TY_Compare
create-function: VECTOR_OF_TY_Create
copy-function: VECTOR_OF_TY_Copy
destroy-function: VECTOR_OF_TY_Destroy
default-value: 0
multiple-block: yes
short-block-size: 1
heap-size-estimate: 256
can-exchange: yes
constant-compilation-method: special
compare-function: LIST_OF_TY_Compare
distinguish-function: LIST_OF_TY_Distinguish
say-function: LIST_OF_TY_Say
create-function: LIST_OF_TY_Create
copy-function: LIST_OF_TY_Copy
quick-copy-function: LIST_OF_TY_QuickCopy
destroy-function: LIST_OF_TY_Destroy
hash-function: LIST_OF_TY_Hash
long-block-size-function: LIST_OF_TY_LongBlockSize
index-priority: 2
index-default-value: 0
specification-text: A three-vector which can hold any kind of value in its x, y, z coordinates.
}
```
Much of this setup is as it was our `CMYK colour` example. The idea is that these settings are held in common by all kinds of the `list of K` shape. They all conform to ```POINTER_VALUE_TY```, and so on.
These are settings held in common by all kinds of the `vector of K` shape. They all conform to ```POINTER_VALUE_TY```, and so on. Notice the use of ```k``` in the singular and plural names.
```terms: covariant``` has to do with whether narrowing the kind parameter `K` also narrows `list of K`, which is covariance, or widens it, which would be contravariance. In practice, a good way to think about to consider that a door is a kind of thing, and see what happens if `K` is changed from `thing` to `door`. For example:
```terms: covariant``` is also new. This has to do with whether narrowing the kind parameter `K` also narrows `vector of K`, which is covariance, or widens it, which would be contravariance. In practice, a good way to think about to consider that a door is a kind of thing, and see what happens if `K` is changed from `thing` to `door`. For example:
- Is a list of doors also a list of things? Yes — because the door terms are also things. Is a list of things also a list of doors? No. Conceptually, `K1` < `K2` means `list of K1` < `list of K2`. So the `K` term in `list of K` must be _covariant_.
- Is a vector of doors also a vector of things? Yes — because the door terms are also things. Is a vector of things also a vector of doors? No — because not all things are doors. Conceptually, `K1` < `K2` means `vector of K1` < `vector of K2`. So the `K` term in `vector of K` must be _covariant_.
- Is an activity on doors also an activity on things? No — because the activity can't operate on things other than doors. Is an activity on things also an activity on doors? Yes — if it can act on all things, it can certainly act on doors. Conceptually, `K1` < `K2` means `activity on K1` > `activity on K2`. So the `K` term in `activity in K` must be _contravariant_.
When a constructor takes two parameters, they can go in opposite directions. `K based rule producing L` is contravariant in `K`, but covariant in `L`. For that, we would write `terms: contravariant, covariant`.
When a constructor takes two parameters, they can go in opposite directions. `K based rule producing L` is contravariant in `K`, but covariant in `L`. For that, we would write ```terms: contravariant, covariant```.
Terms can also be optional, and we can give multiple names. The declaration of `RULE_TY` in Neptune actually goes like so:
``` code
builtin constructor RULE_TY {
conforms-to: SAYABLE_VALUE_TY
compatible-with: RULEBOOK_TY
...
singular: rule | k based rule | rule producing l | k based rule producing l
plural: rules | k based rules | rules producing l | k based rules producing l
terms: contravariant optional, covariant optional
@ -22274,28 +22345,115 @@ builtin constructor RULE_TY {
Note the pipe characters ```|``` dividing the possible names.
Beyond that, the definition is surprisingly similar to the way `CMYK colour` was handled in the previous section. There are two main differences: the amount of data can vary as the list lengthens or shortens, instead of being fixed at 5 words. So it need ```multiple-block: yes``` rather than ```no```. The ```heap-size-estimate``` is a good bit larger, too. Lists are often much smaller, but we want to guess on the high side.
However, all of that is a digression: `vector of K` has only one possible name, and the `K` term is covariant.
Long blocks for lists consist of two header words — the kind ID for the contents, and the number of entries — followed by the entries themselves. So for the list `{ 2, 3, 5, 7 }`, the long block data would be six words in all: ```NUMBER_TY, 4, 2, 3, 5, 7```.
As might be guessed, copying and destruction are easy if the kind being listed is stored in simple values. They become harder if not. For example:
In fact, `vector of K` is set up surprisingly similarly to plain `vector`. The layout in memory is the same: a five-word short block with no long block, and where the memory manager owns words 0 and 1, so that we can use words 2, 3 and 4 for the x, y and z coordinates. There are really just two complications. The first of these appears when we want to say a vector:
``` code
Constant LIST_ITEM_KOV_F = 0; ! The kind of the items
Constant LIST_LENGTH_F = 1; ! The number of items
Constant LIST_ITEM_BASE = 2; ! List items begin at this entry
[ VECTOR_OF_TY_Say vec scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(vec), 0);
print "(";
SayKindValuePair(scalar_kind_id, vec-->VECTOR_X_SF);
print ",";
SayKindValuePair(scalar_kind_id, vec-->VECTOR_Y_SF);
print ",";
SayKindValuePair(scalar_kind_id, vec-->VECTOR_Z_SF);
print ")";
];
```
[ LIST_OF_TY_Destroy list no_items i k;
k = PVField(list, LIST_ITEM_KOV_F);
if (KindConformsTo_POINTER_VALUE_TY(k)) {
no_items = PVField(list, LIST_LENGTH_F);
for (i=0: i<no_items: i++)
DestroyPV(PVField(list, i+LIST_ITEM_BASE));
Here an issue is that we can't say the coordinate values unless we know what kind they are: a `vector of numbers` must look different from a `vector of texts`. So we need to find out what the contents of ```vec``` are. For example, ```KindOfShortBlockOnlyPV``` returns something like `vector of real numbers`, and then ```KindConstructorTerm``` applied to that returns `real number`, so this is what goes into ```scalar_kind_id```. The function ```SayKindValuePair``` then takes care of saying the value according to that kind's conventions.
Similarly for comparisons:
``` code
[ VECTOR_OF_TY_Compare vec1 vec2 n1 n2 i d scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(vec1), 0);
for (i=VECTOR_X_SF: i<=VECTOR_Z_SF: i++) {
d = CompareKindValuePairs(scalar_kind_id, vec1-->i, scalar_kind_id, vec2-->i);
if (d ~= 0) return d;
}
return 0;
];
```
The other complication is that the scalar kind might be pointer-valued, which means it can't be thrown casually around, and has to be properly created, copied and in due course destroyed. So the create function for a vector has to split into two different procedures:
``` code
[ VECTOR_OF_TY_Create kind_id sb_address
short_block scalar_kind_id;
scalar_kind_id = KindConstructorTerm(kind_id, 0);
short_block = CreatePVShortBlock(sb_address, kind_id);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
short_block-->VECTOR_X_SF = CreatePV(scalar_kind_id);
short_block-->VECTOR_Y_SF = CreatePV(scalar_kind_id);
short_block-->VECTOR_Z_SF = CreatePV(scalar_kind_id);
} else {
short_block-->VECTOR_X_SF = KindDefaultValue(scalar_kind_id);
short_block-->VECTOR_Y_SF = short_block-->VECTOR_X_SF;
short_block-->VECTOR_Z_SF = short_block-->VECTOR_X_SF;
}
return short_block;
];
```
We also now need a destroy function, which plain `vector` didn't need, in case we have created something which needs proper disposal:
``` code
[ VECTOR_OF_TY_Destroy vec scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(vec), 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
DestroyPV(vec-->VECTOR_X_SF);
DestroyPV(vec-->VECTOR_Y_SF);
DestroyPV(vec-->VECTOR_Z_SF);
}
];
```
And this ensures that if ```DestroyPV``` is called on `{ { "red", "blue" }, { "green" }, { "purple", "orange" } }`, which is a `list of lists of texts`, say, then the process will recurse so that the values are destroyed in this sequence:
The copy function is also similar to the one for `vector`, but also has to handle the coordinates more carefully:
``` code
[ VECTOR_OF_TY_Copy vecto vecfrom scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(vecto), 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
CopyPV(vecto-->VECTOR_X_SF, vecfrom-->VECTOR_X_SF);
CopyPV(vecto-->VECTOR_Y_SF, vecfrom-->VECTOR_Y_SF);
CopyPV(vecto-->VECTOR_Z_SF, vecfrom-->VECTOR_Z_SF);
} else {
vecto-->VECTOR_X_SF = vecfrom-->VECTOR_X_SF;
vecto-->VECTOR_Y_SF = vecfrom-->VECTOR_Y_SF;
vecto-->VECTOR_Z_SF = vecfrom-->VECTOR_Z_SF;
}
return false;
];
```
And that's all the kit coding done: we just need an Inform phrase to create such vectors, which we'll do using a kind variable `K`:
To decide which vector of K is vector x (X - value of kind K) y (Y - K) z (Z - K):
(- (VECTOR_OF_TY_New({-new: vector of K}, {X}, {Y}, {Z})) -).
And with this done, for example,
showme vector x "aleph" y "beth" z "gimel";
showme vector x -4.5 y 0.002 z 16.34;
showme vector x (vector x 1 y 2 z 3) y (vector x 4 y 5 z 6) z (vector x 7 y 8 z 9);
produces:
``` transcript
"vector x "aleph" y "beth" z "gimel"" = vector of texts: (aleph,beth,gimel)
"vector x -4.5 y 0.002 z 16.34" = vector of real numbers: (-4.5,0.002,16.34)
"vector x (vector x 1 y 2 z 3) y (vector x 4 y 5 z 6) z (vector x 7 y 8 z 9)" = vector of vectors of numbers: ((1,2,3),(4,5,6),(7,8,9))
```
So we have a fully-operational kind construction, `vector of K`, where `K` can be any kind.
Kind constructions can become quite elaborate, and all of the functions for copying and destroying their values have to operate recursively as a result. For example, when ```DestroyPV``` is applied to the list `{ { "red", "blue" }, { "green" }, { "purple", "orange" } }`, which is a `list of lists of texts`, say, then the process will recurse so that the values are destroyed in this sequence:
"red"
"blue"
@ -22307,4 +22465,232 @@ And this ensures that if ```DestroyPV``` is called on `{ { "red", "blue" }, { "g
{ "purple", "orange" }
{ { "red", "blue" }, { "green" }, { "purple", "orange" } }
Thus our single call to ```DestroyPV``` resulted in 8 other calls to it before the original call finished.
Thus our single call to ```DestroyPV``` resulted in 8 other calls to it before the original call finished. But this process is automatic, or rather, is managed by ```BasicInformKit``` for us. The same will happen if we destroy, say, a `vector of vectors of vectors of lists of text`.
## Neptune and optionals
As a second worked example, the following implements `optional K`, a kind which can hold _either_ a value of the kind `K`, _or_ a special "no value" value. Using this, it's possible to design phrases which produce valid answers even when the task they perform is sometimes impossible.
As usual, we start with the Neptune definition:
``` code
new constructor OPTIONAL_TY {
conforms-to: POINTER_VALUE_TY
conforms-to: SAYABLE_VALUE_TY
singular: optional k
plural: optional k
terms: covariant
short-block-size: 3
long-block-size: 0
say-function: OPTIONAL_TY_Say
compare-function: OPTIONAL_TY_Compare
create-function: OPTIONAL_TY_Create
copy-function: OPTIONAL_TY_Copy
destroy-function: OPTIONAL_TY_Destroy
index-priority: 2
index-default-value: 0
specification-text: A way to hold either a value, or a "no value" alternative.
}
```
These are very small: no long block, and the short block holds just one word of data. In fact, though, it also makes use of the memory manager's four bits of spare data in the short block header: or at least, it makes use of one of them.
``` code
Constant OPTIONAL_CONTENT_SF = 2;
Constant OPTIONAL_TY_NO_VALUE_SBF = 1;
[ OPTIONAL_TY_Say opt scalar_kind_id;
if (ShortBlockOnlyPVFlags(opt, 0) & OPTIONAL_TY_NO_VALUE_SBF) {
print "no value";
} else {
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(opt), 0);
SayKindValuePair(scalar_kind_id, opt-->OPTIONAL_CONTENT_SF);
}
];
```
As this may suggest, four bits are stored with every short block of a short-block-only kind, and they are free for us to use as we would like, with the following pair of functions:
> ---
>
> ```ShortBlockOnlyPVFlags(pv)```
>
> Returns the current state of the 4-bit bitmap for the short-block-only pointer value ```pv```. By definition, can only return a number from 0 to 15, i.e., binary 0000 to 1111, and for a newly created value it will be 0000. This call is potentially disastrous if ```pv``` is a pointer value which does have a long block, so use with care.
>
> ---
>
> ```WriteShortBlockOnlyPVFlags(pv, flags)```
>
> Writes ```flags``` to become the current state of the 4-bit bitmap for the short-block-only pointer value ```pv```. ```flags``` must be between 0 and 15, i.e., binary 0000 to 1111. This call is potentially disastrous if ```pv``` is a pointer value which does have a long block, so use with care.
>
> ---
We are going to use only the least significant bit of the four. When this is set, the optional will be "no value", and the content field will hold 0. When it is clear, the optional will have a value, stored in the content field.
The following performs comparisons. "No value" is considered to be less than all existing values.
``` code
[ OPTIONAL_TY_Compare opt1 opt2 scalar_kind_id;
if (ShortBlockOnlyPVFlags(opt1, 0) & OPTIONAL_TY_NO_VALUE_SBF) {
if (ShortBlockOnlyPVFlags(opt2, 0) & OPTIONAL_TY_NO_VALUE_SBF) return 0;
return -1;
}
if (ShortBlockOnlyPVFlags(opt2, 0) & OPTIONAL_TY_NO_VALUE_SBF) return 1;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(opt1), 0);
return CompareKindValuePairs(
scalar_kind_id, opt1-->OPTIONAL_CONTENT_SF,
scalar_kind_id, opt2-->OPTIONAL_CONTENT_SF);
];
```
We create an optional as having no value:
``` code
[ OPTIONAL_TY_Create kind_id sb_address
short_block scalar_kind_id;
scalar_kind_id = KindConstructorTerm(kind_id, 0);
short_block = CreatePVShortBlock(sb_address, kind_id);
WriteShortBlockOnlyPVFlags(short_block, OPTIONAL_TY_NO_VALUE_SBF);
short_block-->OPTIONAL_CONTENT_SF = 0;
return short_block;
];
```
Destruction is instant except in the one case where the optional does hold a
value, and it's of a kind which needs to be destroyed:
``` code
[ OPTIONAL_TY_Destroy opt scalar_kind_id;
if (ShortBlockOnlyPVFlags(opt, 0) & OPTIONAL_TY_NO_VALUE_SBF) return;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(opt), 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id))
DestroyPV(opt-->OPTIONAL_CONTENT_SF);
];
```
The copy mechanism is the most laborious, because it may mean destruction if
no value is copied into an optional with a value, or creation if the other
way around:
``` code
[ OPTIONAL_TY_Copy optto optfrom scalar_kind_id;
if (ShortBlockOnlyPVFlags(optfrom, 0) & OPTIONAL_TY_NO_VALUE_SBF) {
if (ShortBlockOnlyPVFlags(optto, 0) & OPTIONAL_TY_NO_VALUE_SBF == 0) {
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(optto), 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id))
DestroyPV(optto-->OPTIONAL_CONTENT_SF);
optto-->OPTIONAL_CONTENT_SF = 0;
WriteShortBlockOnlyPVFlags(optto, OPTIONAL_TY_NO_VALUE_SBF);
}
} else {
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(optto), 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
if (ShortBlockOnlyPVFlags(optto, 0) & OPTIONAL_TY_NO_VALUE_SBF)
optto-->OPTIONAL_CONTENT_SF = CreatePV(scalar_kind_id);
CopyPV(optto-->OPTIONAL_CONTENT_SF, optfrom-->OPTIONAL_CONTENT_SF);
} else {
optto-->OPTIONAL_CONTENT_SF = optfrom-->OPTIONAL_CONTENT_SF;
}
WriteShortBlockOnlyPVFlags(optto, 0);
}
return false;
];
```
That sets up the kind. We want to perform three basic operations on it: wrapping a value as an optional, unwrapping an optional into a value, and detecting whether an optional does or doesn't have a value.
``` code
[ OPTIONAL_TY_Wrap opt x scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(opt), 0);
WriteShortBlockOnlyPVFlags(opt, 0);
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
if (opt-->OPTIONAL_CONTENT_SF == 0)
opt-->OPTIONAL_CONTENT_SF = CreatePV(scalar_kind_id);
CopyPV(opt-->OPTIONAL_CONTENT_SF, x);
} else {
opt-->OPTIONAL_CONTENT_SF = x;
}
return opt;
];
[ OPTIONAL_TY_Unwrap val opt scalar_kind_id;
scalar_kind_id = KindConstructorTerm(KindOfShortBlockOnlyPV(opt), 0);
if (ShortBlockOnlyPVFlags(opt, 0) & OPTIONAL_TY_NO_VALUE_SBF) {
BlkValueError("unwrapped an optional value with no value");
val = KindDefaultValue(scalar_kind_id);
}
if (KindConformsTo_POINTER_VALUE_TY(scalar_kind_id)) {
CopyPV(val, opt-->OPTIONAL_CONTENT_SF);
} else {
val = opt-->OPTIONAL_CONTENT_SF;
}
return val;
];
[ OPTIONAL_TY_Exists opt;
if (ShortBlockOnlyPVFlags(opt, 0) & OPTIONAL_TY_NO_VALUE_SBF)
rfalse;
rtrue;
];
```
And finally we need some phrases:
To decide which optional K is (X - value of kind K) as optional:
(- (OPTIONAL_TY_Wrap({-new: optional K}, {X})) -).
To decide if (X - optional value) exists:
(- (OPTIONAL_TY_Exists({-by-reference:X})) -).
To decide which K is (X - optional value of kind K) as value:
(- (OPTIONAL_TY_Unwrap({-new: K}, {-by-reference:X})) -).
With all of that done:
showme "Pie!" as optional;
let Q be an optional real number;
showme Q;
showme whether or not Q exists;
let Q be pi as optional;
showme Q;
showme whether or not Q exists;
showme Q as value;
showme e as optional as value;
produces:
``` transcript
""Pie!" as optional" = optional texts: Pie!
"Q" = optional real numbers: no value
"whether or not Q exists" = truth state: false
"Q" = optional real numbers: 3.14159
"whether or not Q exists" = truth state: true
"Q as value" = real number: 3.14159
"e as optional as value" = real number: 2.71828
```
So here is how `optional K` might be used to make a phrase "type-safe" even though it sometimes has no good answer:
To decide which optional K is the first entry of (L - list of values of kind K):
repeat with entry running through L:
decide on the entry as optional;
let the non-entry be an optional K;
decide on the non-entry;
and then:
showme the first entry of { "alpha", "beta", "gamma" };
let L be a list of numbers;
showme the first entry of L;
produces:
``` transcript
"first entry of { "alpha", "beta", "gamma" }" = optional texts: alpha
"first entry of L" = optional numbers: no value
```

View file

@ -345,21 +345,35 @@ int Kinds::Behaviour::uses_block_values(kind *K) {
return KindConstructors::uses_block_values(K->construct);
}
@ Exactly how large the small block is:
@ Exactly how large the small block is. The addition of 2 here is to allow for
the short block header size in a short-block-only pointer value, and must
correspond to the constant ```SBONLYPV_FIELDS``` defined in
```BasicInformKit```.
=
int Kinds::Behaviour::get_short_block_size(kind *K) {
if (K == NULL) return 0;
return K->construct->short_block_size;
int SB = K->construct->short_block_size;
if ((K->construct->long_block_size == 0) &&
(K->construct->flexible_long_block_size == 0)) SB += 2;
return SB;
}
@ A reasonable estimate of how large the (larger!) heap block needs to be,
for a pointer-value kind, in bytes.
@ A minimum field count for the long block:
=
int Kinds::Behaviour::get_heap_size_estimate(kind *K) {
int Kinds::Behaviour::get_long_block_size(kind *K) {
if (K == NULL) return 0;
return K->construct->heap_size_estimate;
return K->construct->long_block_size;
}
@ 0 if the long block is not flexible in size, and otherwise its typical
likely number of fields in practice.
=
int Kinds::Behaviour::get_flexible_long_block_size(kind *K) {
if (K == NULL) return 0;
return K->construct->flexible_long_block_size;
}
@ And the following returns the name of an I6 routine to determine if two

View file

@ -48,12 +48,12 @@ void KindCommands::apply(single_kind_command stc, kind_constructor *con) {
SET_BOOLEAN_FIELD(can_exchange)
SET_BOOLEAN_FIELD(indexed_grey_if_empty)
SET_BOOLEAN_FIELD(is_incompletely_defined)
SET_BOOLEAN_FIELD(multiple_block)
SET_BOOLEAN_FIELD(forbid_assertion_creation)
SET_INTEGER_FIELD(heap_size_estimate)
SET_INTEGER_FIELD(index_priority)
SET_INTEGER_FIELD(short_block_size)
SET_INTEGER_FIELD(long_block_size)
SET_INTEGER_FIELD(flexible_long_block_size)
SET_CCM_FIELD(constant_compilation_method)

View file

@ -67,11 +67,11 @@ typedef struct kind_constructor {
#ifdef CORE_MODULE
struct kind_constructor_compilation_data compilation_data;
#endif
int short_block_size; /* if stored as a block value, size in words of the SB */
/* I: storing values at run-time */
int multiple_block; /* TRUE for flexible-size values stored on the heap */
int heap_size_estimate; /* typical number of bytes used */
int short_block_size; /* if stored as a block value, size in words of the SB */
int long_block_size; /* if stored as a block value, minimum number of LB fields */
int flexible_long_block_size; /* if stored as a block value, typical number of LB fields */
int can_exchange; /* with external files and therefore other story files */
struct text_stream *distinguish_function; /* Inter routine to see if values distinguishable */
struct kind_constructor_comparison_schema *first_comparison_schema; /* list of these */
@ -274,9 +274,9 @@ we apply any defaults set in Neptune files.
con->class_number = 0;
/* I: storing values at run-time */
con->multiple_block = FALSE;
con->long_block_size = 0;
con->flexible_long_block_size = 0;
con->short_block_size = 1;
con->heap_size_estimate = 0;
con->can_exchange = FALSE;
con->first_comparison_schema = NULL;
con->distinguish_function = NULL;

View file

@ -40,7 +40,6 @@ typedef struct kind_command_definition {
@e documentation_reference_KCC
@e understand_function_KCC
@e forbid_assertion_creation_KCC
@e heap_size_estimate_KCC
@e printing_routine_for_debugging_KCC
@e say_function_KCC
@e index_default_value_KCC
@ -52,7 +51,8 @@ typedef struct kind_command_definition {
@e is_incompletely_defined_KCC
@e loop_domain_schema_KCC
@e modifying_adjective_KCC
@e multiple_block_KCC
@e long_block_size_KCC
@e flexible_long_block_size_KCC
@e plural_KCC
@e recognise_function_KCC
@e singular_KCC
@ -79,7 +79,10 @@ kind_command_definition table_of_kind_commands[] = {
{ "can-exchange", can_exchange_KCC, BOOLEAN_KCA, NULL },
{ "indexed-grey-if-empty", indexed_grey_if_empty_KCC, BOOLEAN_KCA, NULL },
{ "is-incompletely-defined", is_incompletely_defined_KCC, BOOLEAN_KCA, NULL },
{ "multiple-block", multiple_block_KCC, BOOLEAN_KCA, NULL },
{ "multiple-block", -1, BOOLEAN_KCA,
"'multiple-block: no' can be omitted; 'multiple-block: yes' should now be 'flexible-long-block-size: N' for some typical field count N" },
{ "long-block-size", long_block_size_KCC, NUMERIC_KCA, NULL },
{ "flexible-long-block-size", flexible_long_block_size_KCC, NUMERIC_KCA, NULL },
{ "forbid-assertion-creation", forbid_assertion_creation_KCC, BOOLEAN_KCA, NULL },
{ "constant-compilation-method", constant_compilation_method_KCC, CCM_KCA, NULL },
@ -129,7 +132,6 @@ kind_command_definition table_of_kind_commands[] = {
{ "singular", singular_KCC, VOCABULARY_KCA, NULL },
{ "terms", terms_KCC, TEXT_KCA, NULL },
{ "heap-size-estimate", heap_size_estimate_KCC, NUMERIC_KCA, NULL },
{ "index-priority", index_priority_KCC, NUMERIC_KCA, NULL },
{ "small-block-size", short_block_size_KCC, NUMERIC_KCA,
"this command has been renamed 'short-block-size'" },