1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-02 23:14:57 +03:00

Eliminated EitherOrProperty access functions

This commit is contained in:
Graham Nelson 2021-10-04 09:39:15 +01:00
parent 38c332d7ba
commit db3b345654
9 changed files with 206 additions and 277 deletions

View file

@ -42,7 +42,7 @@
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">BasicInformKit</a></li><li><b>RTP Template</b></li></ul></div>
<p class="purpose">To issue run-time problem messages, and to perform some run-time type checking which may issue such messages.</p>
<ul class="toc"><li><a href="S-rtp.html#SP1">&#167;1. Reporting</a></li><li><a href="S-rtp.html#SP2">&#167;2. Low-Level Errors</a></li><li><a href="S-rtp.html#SP3">&#167;3. Argument Type Checking Failed</a></li><li><a href="S-rtp.html#SP4">&#167;4. Return Type Checking Failed</a></li><li><a href="S-rtp.html#SP5">&#167;5. Whether Provides</a></li><li><a href="S-rtp.html#SP6">&#167;6. Scan Property Metadata</a></li><li><a href="S-rtp.html#SP7">&#167;7. Get Either-Or Property</a></li><li><a href="S-rtp.html#SP8">&#167;8. Set Either-Or Property</a></li><li><a href="S-rtp.html#SP9">&#167;9. Value Property</a></li><li><a href="S-rtp.html#SP10">&#167;10. Write Value Property</a></li><li><a href="S-rtp.html#SP11">&#167;11. Printing Property Names</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-rtp.html#SP1">&#167;1. Reporting</a></li><li><a href="S-rtp.html#SP2">&#167;2. Low-Level Errors</a></li><li><a href="S-rtp.html#SP3">&#167;3. Argument Type Checking Failed</a></li><li><a href="S-rtp.html#SP4">&#167;4. Return Type Checking Failed</a></li><li><a href="S-rtp.html#SP5">&#167;5. Whether Provides</a></li><li><a href="S-rtp.html#SP6">&#167;6. Scan Property Metadata</a></li><li><a href="S-rtp.html#SP7">&#167;7. Read Property</a></li><li><a href="S-rtp.html#SP8">&#167;8. Write Property</a></li><li><a href="S-rtp.html#SP9">&#167;9. Printing Property Names</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Reporting. </b>All RTPs are produced by calling the following routine, which takes one
compulsory argument: <span class="extract"><span class="extract-syntax">n</span></span>, the RTP number. When I7 is being used with the
@ -307,11 +307,11 @@ it doesn't mean it actually does have.
<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">OBJECT_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">obj</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">1</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">obj</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">value_ranges</span><span class="plain-syntax">--&gt;</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">issue_rtp</span><span class="plain-syntax">) </span><span class="identifier-syntax">RunTimeProblem</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTP_BADVALUEPROPERTY</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</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="identifier-syntax">holder</span><span class="plain-syntax"> = </span><span class="identifier-syntax">value_property_holders</span><span class="plain-syntax">--&gt;</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">holder</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">holder</span><span class="plain-syntax"> </span><span class="reserved-syntax">provides</span><span class="plain-syntax"> </span><span class="identifier-syntax">q</span><span class="plain-syntax">)) </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</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">obj</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">issue_rtp</span><span class="plain-syntax">) </span><span class="identifier-syntax">RunTimeProblem</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTP_PROPOFNOTHING</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
@ -334,9 +334,7 @@ it doesn't mean it actually does have.
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">PermissionFound</span><span class="plain-syntax">;</span>
<span class="comment-syntax"> if (either_or ~= q--&gt;2) { print (PrintPropertyName) q, " differs: ", either_or, " vs ", q--&gt;2, "^"; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">q</span><span class="plain-syntax">--&gt;2) </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="comment-syntax">if (either_or) rtrue;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">obj</span><span class="plain-syntax"> </span><span class="reserved-syntax">provides</span><span class="plain-syntax"> </span><span class="identifier-syntax">q</span><span class="plain-syntax">) </span><span class="reserved-syntax">rtrue</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">issue_rtp</span><span class="plain-syntax">) </span><span class="identifier-syntax">RunTimeProblem</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTP_UNSET</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
@ -361,58 +359,7 @@ The following searches from a given offset.
<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="SP7" class="paragraph-anchor"></a><b>&#167;7. Get Either-Or Property. </b>If <span class="extract"><span class="extract-syntax">p</span></span> represents a property, then <span class="extract"><span class="extract-syntax">~p</span></span> (its bitwise negation) represents its
logical negation. The bitwise negation will change the sign bit; since all
properties are ordinarily positive, we can detect bitwise negation by looking
for negative property numbers. (This could fail on Glulx story files above
1GB in size, but that's about 1000 times the size of the record-sized file
created thus far.)
</p>
<p class="commentary">FBNA stands for First Boolean Not to be an Attribute, in the I6 sense. Some
either/or (i.e., boolean) properties are stored as I6 attributes, others as
I6 properties whose values are always <span class="extract"><span class="extract-syntax">true</span></span> or <span class="extract"><span class="extract-syntax">false</span></span>.
</p>
<p class="commentary">Note that we allow either/or properties to be {\it read} for any object,
regardless of permissions, returning <span class="extract"><span class="extract-syntax">false</span></span> if the object does not have
the property. This is so that a description such as "open things" can be
applied against any object without run-time errors, even though it is only
normally valid for doors and containers.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">GetEitherOrProperty</span><span class="plain-syntax"> </span><span class="identifier-syntax">o</span><span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">;</span>
<span class="comment-syntax">return GProperty(OBJECT_TY, o, p);</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"> == </span><span class="reserved-syntax">nothing</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</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">p</span><span class="plain-syntax">&lt;0) </span><span class="identifier-syntax">p</span><span class="plain-syntax"> = ~</span><span class="identifier-syntax">p</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">WhetherProvides</span><span class="plain-syntax">(</span><span class="identifier-syntax">OBJECT_TY</span><span class="plain-syntax">, </span><span class="identifier-syntax">o</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="reserved-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">o</span><span class="plain-syntax"> </span><span class="reserved-syntax">has</span><span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">) </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<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="SP8" class="paragraph-anchor"></a><b>&#167;8. Set Either-Or Property. </b>An attempt to {\it write} an either/or property which is not provided will,
however, always produce a run-time problem.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">SetEitherOrProperty</span><span class="plain-syntax"> </span><span class="identifier-syntax">o</span><span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax"> </span><span class="identifier-syntax">negate</span><span class="plain-syntax"> </span><span class="identifier-syntax">adj</span><span class="plain-syntax">;</span>
<span class="comment-syntax">if (negate) WriteGProperty(OBJECT_TY, o, p, 0);</span>
<span class="comment-syntax">else WriteGProperty(OBJECT_TY, o, p, 1);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">p</span><span class="plain-syntax">&lt;0) { </span><span class="identifier-syntax">p</span><span class="plain-syntax"> = ~</span><span class="identifier-syntax">p</span><span class="plain-syntax">; </span><span class="identifier-syntax">negate</span><span class="plain-syntax"> = ~</span><span class="identifier-syntax">negate</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">adj</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">adj</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">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">WhetherProvides</span><span class="plain-syntax">(</span><span class="identifier-syntax">OBJECT_TY</span><span class="plain-syntax">, </span><span class="identifier-syntax">o</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">negate</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">give</span><span class="plain-syntax"> </span><span class="identifier-syntax">o</span><span class="plain-syntax"> ~</span><span class="identifier-syntax">p</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="reserved-syntax">give</span><span class="plain-syntax"> </span><span class="identifier-syntax">o</span><span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</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. Value Property. </b>Some value properties belong to other values (those created in tables), and
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Read Property. </b>Some value properties belong to other values (those created in tables), and
these are stored indirectly through a pseudo-object <span class="extract"><span class="extract-syntax">V</span></span> &mdash; an I6 object which
is not part of the world model, and not a valid I7 "object" value, but which is
used in order that properties belonging to values
@ -428,9 +375,12 @@ the one which the player is on.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">GProperty</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> </span><span class="identifier-syntax">holder</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">WhetherProvides</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="reserved-syntax">true</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">GProperty</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax"> </span><span class="identifier-syntax">holder</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">WhetherProvides</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">-</span><span class="identifier-syntax">err</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">OBJECT_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">pr</span><span class="plain-syntax">--&gt;0 == </span><span class="constant-syntax">2</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">V</span><span class="plain-syntax"> </span><span class="reserved-syntax">has</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">) </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; </span><span class="reserved-syntax">rfalse</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">pr</span><span class="plain-syntax"> == </span><span class="identifier-syntax">door_to</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">.</span><span class="identifier-syntax">pr</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">V</span><span class="plain-syntax">.</span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
@ -441,7 +391,7 @@ the one which the player is on.
<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="SP10" class="paragraph-anchor"></a><b>&#167;10. Write Value Property. </b>This routine's name must consist of the read-value-property routine's name
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Write Property. </b>This routine's name must consist of the read-value-property routine's name
with the prefix <span class="extract"><span class="extract-syntax">Write</span></span>, as that is how a reference to such a property is
converted from an rvalue to an lvalue.
</p>
@ -450,7 +400,11 @@ converted from an rvalue to an lvalue.
<span class="plain-syntax">[ </span><span class="identifier-syntax">WriteGProperty</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax"> </span><span class="identifier-syntax">holder</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">WhetherProvides</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">OBJECT_TY</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">.</span><span class="identifier-syntax">pr</span><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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">--&gt;0 == </span><span class="constant-syntax">2</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">val</span><span class="plain-syntax">) </span><span class="reserved-syntax">give</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">give</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> ~</span><span class="identifier-syntax">pr</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="identifier-syntax">V</span><span class="plain-syntax">.</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">val</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="plain-syntax"> </span><span class="identifier-syntax">holder</span><span class="plain-syntax"> = </span><span class="identifier-syntax">value_property_holders</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">holder</span><span class="plain-syntax">.</span><span class="identifier-syntax">pr</span><span class="plain-syntax">)--&gt;(</span><span class="identifier-syntax">V</span><span class="plain-syntax">+</span><span class="identifier-syntax">COL_HSIZE</span><span class="plain-syntax">) = </span><span class="identifier-syntax">val</span><span class="plain-syntax">;</span>
@ -458,7 +412,7 @@ converted from an rvalue to an lvalue.
<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. Printing Property Names. </b>Inform doesn't print property names prettily; it more or less prints them
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Printing Property Names. </b>Inform doesn't print property names prettily; it more or less prints them
only as decimal numbers.
</p>

View file

@ -195,8 +195,8 @@ which is true if the value of <span class="extract"><span class="extract-syntax"
false for <span class="extract"><span class="extract-syntax">false</span></span>.
</p>
<p class="commentary">The preferred way to do this is to use the pair of functions <span class="extract"><span class="extract-syntax">GetEitherOrProperty</span></span>
or <span class="extract"><span class="extract-syntax">SetEitherOrProperty</span></span>, defined in <a href="../BasicInformKit/index.html" class="internal">BasicInformKit</a>, because that way
<p class="commentary">The preferred way to do this is to use the pair of functions <span class="extract"><span class="extract-syntax">GProperty</span></span>
or <span class="extract"><span class="extract-syntax">WriteGProperty</span></span>, defined in <a href="../BasicInformKit/index.html" class="internal">BasicInformKit</a>, because that way
suitable runtime problems are generated for mistaken accesses. But if we
want the fastest possible access and know that it will be valid, we can use
the following.

View file

@ -396,24 +396,24 @@ which would work just as well, but more slowly.
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">neg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEST_ATOM_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"GetEitherOrProperty(*1, %n) == false"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"GProperty(OBJECT_TY, *1, %n, true) == false"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_TRUE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"SetEitherOrProperty(*1, %n, true)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(OBJECT_TY, *1, %n, 0)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_FALSE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"SetEitherOrProperty(*1, %n, false)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(OBJECT_TY, *1, %n, 1)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</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="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEST_ATOM_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"GetEitherOrProperty(*1, %n)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"GProperty(OBJECT_TY, *1, %n, true)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_TRUE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"SetEitherOrProperty(*1, %n, false)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(OBJECT_TY, *1, %n, 1)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_FALSE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"SetEitherOrProperty(*1, %n, true)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(OBJECT_TY, *1, %n, 0)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-prp.html#SP10">&#167;10</a>.</li></ul>

View file

@ -1,11 +1,11 @@
Total memory consumption was 394265K = 385 MB
Total memory consumption was 394323K = 385 MB
60.6% was used for 2000582 objects, in 371355 frames in 299 x 800K = 239200K = 233 MB:
60.6% was used for 2004452 objects, in 372321 frames in 299 x 800K = 239200K = 233 MB:
10.3% inter_tree_node_array 58 x 8192 = 475136 objects, 41813824 bytes
7.2% text_stream_array 5177 x 100 = 517700 objects, 29156864 bytes
7.2% text_stream_array 5187 x 100 = 518700 objects, 29213184 bytes
4.2% linked_list 30994 objects, 17356640 bytes
3.9% inter_symbol_array 139 x 1024 = 142336 objects, 15946080 bytes
3.9% inter_symbol_array 140 x 1024 = 143360 objects, 16060800 bytes
2.5% parse_node 129368 objects, 10349440 bytes
1.8% verb_conjugation 160 objects, 7425280 bytes
1.3% parse_node_annotation_array 345 x 500 = 172500 objects, 5531040 bytes
@ -13,15 +13,15 @@ Total memory consumption was 394265K = 385 MB
0.8% inter_name_array 69 x 1000 = 69000 objects, 3314208 bytes
0.6% kind_array 68 x 1000 = 68000 objects, 2722176 bytes
0.5% inter_name_generator_array 53 x 1000 = 53000 objects, 2121696 bytes
0.4% inter_schema_token 13465 objects, 1938960 bytes
0.4% inter_package 26569 objects, 1912968 bytes
0.5% inter_schema_token 14185 objects, 2042640 bytes
0.4% inter_package 26565 objects, 1912680 bytes
0.4% package_request 21137 objects, 1860056 bytes
0.4% vocabulary_entry_array 161 x 100 = 16100 objects, 1808352 bytes
0.4% inter_symbols_table 26569 objects, 1700416 bytes
0.3% dictionary 33269 objects, 1596912 bytes
0.4% inter_symbols_table 26565 objects, 1700160 bytes
0.3% dictionary 33265 objects, 1596720 bytes
0.3% match_trie_array 11 x 1000 = 11000 objects, 1496352 bytes
0.3% i6_schema_array 23 x 100 = 2300 objects, 1380736 bytes
0.3% dict_entry_array 393 x 100 = 39300 objects, 1270176 bytes
0.3% dict_entry_array 402 x 100 = 40200 objects, 1299264 bytes
0.2% map_data 670 objects, 1125600 bytes
0.2% id_body 940 objects, 1075360 bytes
0.2% adjective_meaning 202 objects, 1000304 bytes
@ -30,7 +30,7 @@ Total memory consumption was 394265K = 385 MB
0.2% ptoken 8382 objects, 871728 bytes
0.2% grammatical_usage 3611 objects, 866640 bytes
0.2% individual_form 2561 objects, 860496 bytes
0.2% inter_schema_node 8665 objects, 831840 bytes
0.2% inter_schema_node 8905 objects, 854880 bytes
0.1% unary_predicate_array 16 x 1000 = 16000 objects, 640512 bytes
0.1% local_variable_array 47 x 100 = 4700 objects, 452704 bytes
---- scan_directory 94 objects, 388032 bytes
@ -41,7 +41,7 @@ Total memory consumption was 394265K = 385 MB
---- compilation_subtask 3346 objects, 267680 bytes
---- inference_subject 665 objects, 260680 bytes
---- inter_annotation_array 1 x 8192 objects, 196640 bytes
---- hierarchy_location 1118 objects, 169936 bytes
---- hierarchy_location 1116 objects, 169632 bytes
---- binary_predicate 321 objects, 169488 bytes
---- linguistic_stock_item 3316 objects, 159168 bytes
---- rule_family_data 400 objects, 147200 bytes
@ -238,16 +238,16 @@ Total memory consumption was 394265K = 385 MB
39.3% was used for memory not allocated for objects:
20.5% text stream storage 82820540 bytes in 535654 claims
4.5% dictionary storage 18273792 bytes in 33269 claims
20.5% text stream storage 82882584 bytes in 536688 claims
4.5% dictionary storage 18271744 bytes in 33265 claims
---- sorting 736 bytes in 3 claims
1.7% source text 7200000 bytes in 3 claims
2.6% source text details 10800000 bytes in 2 claims
---- documentation fragments 262144 bytes in 1 claim
---- linguistic stock array 81920 bytes in 2 claims
---- small word set array 105600 bytes in 22 claims
1.0% inter symbols storage 4175584 bytes in 27681 claims
4.1% inter bytecode storage 16802772 bytes in 14 claims
1.0% inter symbols storage 4175072 bytes in 27677 claims
4.1% inter bytecode storage 16802732 bytes in 14 claims
4.0% inter links storage 16174208 bytes in 266 claims
---- inter tree location list storage 191232 bytes in 32 claims
0.4% instance-of-kind counting 1695204 bytes in 1 claim
@ -256,5 +256,5 @@ Total memory consumption was 394265K = 385 MB
---- code generation workspace for objects 4128 bytes in 4 claims
---- emitter array storage 161792 bytes in 2062 claims
18.5% was overhead - 74741736 bytes = 72989K = 71 MB
18.4% was overhead - 74415928 bytes = 72671K = 70 MB

View file

@ -1,27 +1,27 @@
100.0% in inform7 run
54.8% in compilation to Inter
55.0% in compilation to Inter
39.5% in //Sequence::undertake_queued_tasks//
3.3% in //MajorNodes::pre_pass//
2.5% in //MajorNodes::pass_1//
3.5% in //MajorNodes::pre_pass//
2.6% in //MajorNodes::pass_1//
2.1% in //RTPhrasebook::compile_entries//
1.4% in //ImperativeDefinitions::assess_all//
1.1% in //RTKindConstructors::compile//
0.4% in //ImperativeDefinitions::compile_first_block//
0.4% in //MajorNodes::pass_2//
0.4% in //Sequence::undertake_queued_tasks//
0.4% in //Sequence::undertake_queued_tasks//
0.4% in //World::stage_V//
0.2% in //CompletionModule::compile//
0.2% in //Sequence::undertake_queued_tasks//
0.1% in //InferenceSubjects::emit_all//
0.1% in //RTKindConstructors::compile_permissions//
0.1% in //Task::make_built_in_kind_constructors//
0.1% in //World::stages_II_and_III//
1.9% not specifically accounted for
43.3% in running Inter pipeline
1.6% not specifically accounted for
43.1% in running Inter pipeline
12.4% in step preparation
9.6% in inter step 7/16: consolidate-text
7.9% in inter step 2/16: link
6.9% in inter step 16/16: generate inform6 -> auto.inf
7.8% in inter step 2/16: link
6.8% in inter step 16/16: generate inform6 -> auto.inf
1.5% in inter step 11/16: make-identifiers-unique
0.4% in inter step 12/16: reconcile-verbs
0.2% in inter step 14/16: eliminate-redundant-operations
@ -33,5 +33,5 @@
0.1% in inter step 4/16: parse-linked-matter
0.1% in inter step 5/16: resolve-conditional-compilation
2.7% not specifically accounted for
1.6% in supervisor
1.7% in supervisor
0.2% not specifically accounted for

View file

@ -264,11 +264,11 @@ it doesn't mean it actually does have.
if (K ~= OBJECT_TY) {
if ((obj < 1) || (obj > value_ranges-->K)) {
if (issue_rtp) RunTimeProblem(RTP_BADVALUEPROPERTY);
rfalse;
} else {
holder = value_property_holders-->K;
if ((holder) && (holder provides q)) rtrue;
}
rfalse;
}
if (obj == 0) {
if (issue_rtp) RunTimeProblem(RTP_PROPOFNOTHING, 0, q);
@ -291,9 +291,7 @@ it doesn't mean it actually does have.
rfalse;
.PermissionFound;
! if (either_or ~= q-->2) { print (PrintPropertyName) q, " differs: ", either_or, " vs ", q-->2, "^"; }
if (q-->2) rtrue;
! if (either_or) rtrue;
if (obj provides q) rtrue;
if (issue_rtp) RunTimeProblem(RTP_UNSET, obj, q);
rfalse;
@ -318,56 +316,7 @@ The following searches from a given offset.
rfalse;
];
@h Get Either-Or Property.
If |p| represents a property, then |~p| (its bitwise negation) represents its
logical negation. The bitwise negation will change the sign bit; since all
properties are ordinarily positive, we can detect bitwise negation by looking
for negative property numbers. (This could fail on Glulx story files above
1GB in size, but that's about 1000 times the size of the record-sized file
created thus far.)
FBNA stands for First Boolean Not to be an Attribute, in the I6 sense. Some
either/or (i.e., boolean) properties are stored as I6 attributes, others as
I6 properties whose values are always |true| or |false|.
Note that we allow either/or properties to be {\it read} for any object,
regardless of permissions, returning |false| if the object does not have
the property. This is so that a description such as "open things" can be
applied against any object without run-time errors, even though it is only
normally valid for doors and containers.
=
[ GetEitherOrProperty o p;
! return GProperty(OBJECT_TY, o, p);
if (o == nothing) rfalse;
if (p<0) p = ~p;
if (WhetherProvides(OBJECT_TY, o, p, false)) {
if (o has p) rtrue; rfalse;
}
rfalse;
];
@h Set Either-Or Property.
An attempt to {\it write} an either/or property which is not provided will,
however, always produce a run-time problem.
=
[ SetEitherOrProperty o p negate adj;
! if (negate) WriteGProperty(OBJECT_TY, o, p, 0);
! else WriteGProperty(OBJECT_TY, o, p, 1);
if (p<0) { p = ~p; negate = ~negate; }
if (adj) {
(adj)(o);
} else if (WhetherProvides(OBJECT_TY, o, p, true)) {
if (negate) {
give o ~p;
} else {
give o p;
}
}
];
@h Value Property.
@h Read Property.
Some value properties belong to other values (those created in tables), and
these are stored indirectly through a pseudo-object |V| -- an I6 object which
is not part of the world model, and not a valid I7 "object" value, but which is
@ -382,9 +331,12 @@ this enables it to be an I6 routine returning the other side of the door from
the one which the player is on.
=
[ GProperty K V pr holder;
if (WhetherProvides(K, V, pr, true)) {
[ GProperty K V pr err holder;
if (WhetherProvides(K, V, pr, 1-err)) {
if (K == OBJECT_TY) {
if (pr-->0 == 2) {
if (V has pr) rtrue; rfalse;
}
if (pr == door_to) return V.pr();
return V.pr;
} else {
@ -395,7 +347,7 @@ the one which the player is on.
return 0;
];
@h Write Value Property.
@h Write Property.
This routine's name must consist of the read-value-property routine's name
with the prefix |Write|, as that is how a reference to such a property is
converted from an rvalue to an lvalue.
@ -404,7 +356,11 @@ converted from an rvalue to an lvalue.
[ WriteGProperty K V pr val holder;
if (WhetherProvides(K, V, pr, true)) {
if (K == OBJECT_TY) {
V.pr = val;
if (pr-->0 == 2) {
if (val) give V pr; else give V ~pr;
} else {
V.pr = val;
}
} else {
holder = value_property_holders-->K;
(holder.pr)-->(V+COL_HSIZE) = val;

View file

@ -8092,7 +8092,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00064 --> /main/BasicInformKit/functions/GetEitherOrProperty_fn/GetEitherOrProperty
symbol external misc plug_00064 --> /main/BasicInformKit/functions/GProperty_fn/GProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_plural_named --> /main/basic_inform_by_graham_nelson/properties/property7/P_plural_named
local t_0 K_object __call_parameter # :object
code
@ -8101,9 +8102,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv GetEitherOrProperty
inv GProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_plural_named
val K_unchecked 1
inv !return
val K_unchecked 0
package adjective_task2 _adjective_task
@ -8115,7 +8118,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00065 --> /main/BasicInformKit/functions/SetEitherOrProperty_fn/SetEitherOrProperty
symbol external misc plug_00065 --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_plural_named --> /main/basic_inform_by_graham_nelson/properties/property7/P_plural_named
local t_0 K_object __call_parameter # :object
code
@ -8124,10 +8128,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv SetEitherOrProperty
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_plural_named
val K_unchecked 0
val K_unchecked 1
inv !return
val K_unchecked 0
package adjective_task3 _adjective_task
@ -8139,7 +8144,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00065 --> /main/BasicInformKit/functions/SetEitherOrProperty_fn/SetEitherOrProperty
symbol external misc plug_00065 --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_plural_named --> /main/basic_inform_by_graham_nelson/properties/property7/P_plural_named
local t_0 K_object __call_parameter # :object
code
@ -8148,10 +8154,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv SetEitherOrProperty
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_plural_named
val K_unchecked 1
val K_unchecked 0
inv !return
val K_unchecked 0
constant ^text K_typeless_string = "plural-named"
@ -8170,7 +8177,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00064 --> /main/BasicInformKit/functions/GetEitherOrProperty_fn/GetEitherOrProperty
symbol external misc plug_00064 --> /main/BasicInformKit/functions/GProperty_fn/GProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_plural_named --> /main/basic_inform_by_graham_nelson/properties/property7/P_plural_named
local t_0 K_object __call_parameter # :object
code
@ -8180,9 +8188,11 @@ package main _plain
code
inv !return
inv !eq
inv GetEitherOrProperty
inv GProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_plural_named
val K_unchecked 1
val K_unchecked 0
inv !return
val K_unchecked 0
@ -8195,7 +8205,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00065 --> /main/BasicInformKit/functions/SetEitherOrProperty_fn/SetEitherOrProperty
symbol external misc plug_00065 --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_plural_named --> /main/basic_inform_by_graham_nelson/properties/property7/P_plural_named
local t_0 K_object __call_parameter # :object
code
@ -8204,10 +8215,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv SetEitherOrProperty
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_plural_named
val K_unchecked 1
val K_unchecked 0
inv !return
val K_unchecked 0
package adjective_task3 _adjective_task
@ -8219,7 +8231,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00065 --> /main/BasicInformKit/functions/SetEitherOrProperty_fn/SetEitherOrProperty
symbol external misc plug_00065 --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_plural_named --> /main/basic_inform_by_graham_nelson/properties/property7/P_plural_named
local t_0 K_object __call_parameter # :object
code
@ -8228,10 +8241,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv SetEitherOrProperty
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_plural_named
val K_unchecked 0
val K_unchecked 1
inv !return
val K_unchecked 0
constant ^text K_typeless_string = "singular-named"
@ -8250,7 +8264,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00064 --> /main/BasicInformKit/functions/GetEitherOrProperty_fn/GetEitherOrProperty
symbol external misc plug_00064 --> /main/BasicInformKit/functions/GProperty_fn/GProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_proper_named --> /main/basic_inform_by_graham_nelson/properties/property9/P_proper_named
local t_0 K_object __call_parameter # :object
code
@ -8259,9 +8274,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv GetEitherOrProperty
inv GProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_proper_named
val K_unchecked 1
inv !return
val K_unchecked 0
package adjective_task2 _adjective_task
@ -8273,7 +8290,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00065 --> /main/BasicInformKit/functions/SetEitherOrProperty_fn/SetEitherOrProperty
symbol external misc plug_00065 --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_proper_named --> /main/basic_inform_by_graham_nelson/properties/property9/P_proper_named
local t_0 K_object __call_parameter # :object
code
@ -8282,10 +8300,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv SetEitherOrProperty
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_proper_named
val K_unchecked 0
val K_unchecked 1
inv !return
val K_unchecked 0
package adjective_task3 _adjective_task
@ -8297,7 +8316,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00065 --> /main/BasicInformKit/functions/SetEitherOrProperty_fn/SetEitherOrProperty
symbol external misc plug_00065 --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_proper_named --> /main/basic_inform_by_graham_nelson/properties/property9/P_proper_named
local t_0 K_object __call_parameter # :object
code
@ -8306,10 +8326,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv SetEitherOrProperty
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_proper_named
val K_unchecked 1
val K_unchecked 0
inv !return
val K_unchecked 0
constant ^text K_typeless_string = "proper-named"
@ -8328,7 +8349,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00064 --> /main/BasicInformKit/functions/GetEitherOrProperty_fn/GetEitherOrProperty
symbol external misc plug_00064 --> /main/BasicInformKit/functions/GProperty_fn/GProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_proper_named --> /main/basic_inform_by_graham_nelson/properties/property9/P_proper_named
local t_0 K_object __call_parameter # :object
code
@ -8338,9 +8360,11 @@ package main _plain
code
inv !return
inv !eq
inv GetEitherOrProperty
inv GProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_proper_named
val K_unchecked 1
val K_unchecked 0
inv !return
val K_unchecked 0
@ -8353,7 +8377,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00065 --> /main/BasicInformKit/functions/SetEitherOrProperty_fn/SetEitherOrProperty
symbol external misc plug_00065 --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_proper_named --> /main/basic_inform_by_graham_nelson/properties/property9/P_proper_named
local t_0 K_object __call_parameter # :object
code
@ -8362,10 +8387,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv SetEitherOrProperty
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_proper_named
val K_unchecked 1
val K_unchecked 0
inv !return
val K_unchecked 0
package adjective_task3 _adjective_task
@ -8377,7 +8403,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00065 --> /main/BasicInformKit/functions/SetEitherOrProperty_fn/SetEitherOrProperty
symbol external misc plug_00065 --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_proper_named --> /main/basic_inform_by_graham_nelson/properties/property9/P_proper_named
local t_0 K_object __call_parameter # :object
code
@ -8386,10 +8413,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv SetEitherOrProperty
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_proper_named
val K_unchecked 0
val K_unchecked 1
inv !return
val K_unchecked 0
constant ^text K_typeless_string = "improper-named"
@ -8408,7 +8436,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00064 --> /main/BasicInformKit/functions/GetEitherOrProperty_fn/GetEitherOrProperty
symbol external misc plug_00064 --> /main/BasicInformKit/functions/GProperty_fn/GProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_ambiguously_plural --> /main/basic_inform_by_graham_nelson/properties/property8/P_ambiguously_plural
local t_0 K_object __call_parameter # :object
code
@ -8417,9 +8446,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv GetEitherOrProperty
inv GProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_ambiguously_plural
val K_unchecked 1
inv !return
val K_unchecked 0
package adjective_task2 _adjective_task
@ -8431,7 +8462,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00065 --> /main/BasicInformKit/functions/SetEitherOrProperty_fn/SetEitherOrProperty
symbol external misc plug_00065 --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_ambiguously_plural --> /main/basic_inform_by_graham_nelson/properties/property8/P_ambiguously_plural
local t_0 K_object __call_parameter # :object
code
@ -8440,10 +8472,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv SetEitherOrProperty
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_ambiguously_plural
val K_unchecked 0
val K_unchecked 1
inv !return
val K_unchecked 0
package adjective_task3 _adjective_task
@ -8455,7 +8488,8 @@ package main _plain
symbol private misc t_0
symbol external misc K_object --> /main/generic/kinds/kind1/K_object
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol external misc plug_00065 --> /main/BasicInformKit/functions/SetEitherOrProperty_fn/SetEitherOrProperty
symbol external misc plug_00065 --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc OBJECT_TY --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc P_ambiguously_plural --> /main/basic_inform_by_graham_nelson/properties/property8/P_ambiguously_plural
local t_0 K_object __call_parameter # :object
code
@ -8464,10 +8498,11 @@ package main _plain
val K_unchecked t_0
code
inv !return
inv SetEitherOrProperty
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked t_0
val K_unchecked P_ambiguously_plural
val K_unchecked 1
val K_unchecked 0
inv !return
val K_unchecked 0
constant ^text K_typeless_string = "ambiguously plural"
@ -34790,7 +34825,7 @@ package main _plain
constant KIT_CONFIGURATION_BITMAP K_typeless_int = 0
constant KIT_CONFIGURATION_LOOKMODE K_typeless_int = 2
constant I7_VERSION_NUMBER K_typeless_string = "10.1.0"
constant I7_FULL_VERSION_NUMBER K_typeless_string = "10.1.0-alpha.1+6T42"
constant I7_FULL_VERSION_NUMBER K_typeless_string = "10.1.0-alpha.1+6T43"
constant ^virtual_machine K_typeless_string = "C/32d/v1/no-main"
constant ^virtual_machine_icon K_typeless_string = "vm_glulx.png"
constant ^language_elements_used K_typeless_string = "core, naming, instance counting, glulx external files"
@ -38517,9 +38552,9 @@ package main _plain
symbol plug misc plug_00061 --> /main/connectors/RELATION_TY_VToOAdjective
symbol plug misc plug_00062 --> /main/connectors/RELATION_TY_VToVAdjective
symbol plug misc plug_00063 --> /main/connectors/REAL_NUMBER_TY_Nan
symbol plug misc plug_00064 --> /main/connectors/GetEitherOrProperty
symbol plug misc plug_00064 --> /main/connectors/GProperty
symbol socket misc K_phrase_object____nothing --> /main/generic/kinds/kind15/K_phrase_object____nothing
symbol plug misc plug_00065 --> /main/connectors/SetEitherOrProperty
symbol plug misc plug_00065 --> /main/connectors/WriteGProperty
symbol plug misc plug_00066 --> /main/connectors/REAL_NUMBER_TY_Pow
symbol socket misc K_phrase_real_number____rea --> /main/generic/kinds/kind15/K_phrase_real_number____rea
symbol plug misc plug_00067 --> /main/connectors/REAL_NUMBER_TY_Plus
@ -97298,46 +97333,17 @@ package main _plain
symbol private misc o
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol private misc p
symbol external misc WhetherProvides --> /main/BasicInformKit/functions/WhetherProvides_fn/WhetherProvides
symbol external misc GProperty --> /main/BasicInformKit/functions/GProperty_fn/GProperty
symbol external misc plug_00140 --> /main/generic/kinds/kind1/OBJECT_TY
local o K_unchecked
local p K_unchecked
code
inv !if
inv !eq
val K_unchecked o
val K_unchecked 0
code
inv !return
val K_unchecked 0
inv !if
inv !lt
val K_unchecked p
val K_unchecked 0
code
inv !store
reference
val K_unchecked p
inv !bitwisenot
val K_unchecked p
inv !if
inv WhetherProvides
inv !return
inv GProperty
val K_unchecked OBJECT_TY
val K_unchecked o
val K_unchecked p
val K_unchecked 0
code
inv !if
inv !has
val K_unchecked o
val K_unchecked p
code
inv !return
val K_unchecked 1
inv !return
val K_unchecked 0
inv !return
val K_unchecked 0
val K_unchecked 1
constant GetEitherOrProperty K_unchecked_function = GetEitherOrProperty_B __assimilated=1
package SetEitherOrProperty_fn _function
symbol public misc SetEitherOrProperty
@ -97348,52 +97354,27 @@ package main _plain
symbol private misc p
symbol private misc negate
symbol private misc adj
symbol external misc WhetherProvides --> /main/BasicInformKit/functions/WhetherProvides_fn/WhetherProvides
symbol external misc WriteGProperty --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc plug_00140 --> /main/generic/kinds/kind1/OBJECT_TY
local o K_unchecked
local p K_unchecked
local negate K_unchecked
local adj K_unchecked
code
inv !if
inv !lt
val K_unchecked p
val K_unchecked 0
code
inv !store
reference
val K_unchecked p
inv !bitwisenot
val K_unchecked p
inv !store
reference
val K_unchecked negate
inv !bitwisenot
val K_unchecked negate
inv !ifelse
val K_unchecked adj
val K_unchecked negate
code
inv !indirect1
val K_unchecked adj
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked o
val K_unchecked p
val K_unchecked 0
code
inv !if
inv WhetherProvides
val K_unchecked OBJECT_TY
val K_unchecked o
val K_unchecked p
val K_unchecked 1
code
inv !ifelse
val K_unchecked negate
code
inv !take
val K_unchecked o
val K_unchecked p
code
inv !give
val K_unchecked o
val K_unchecked p
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked o
val K_unchecked p
val K_unchecked 1
constant SetEitherOrProperty K_unchecked_function = SetEitherOrProperty_B __assimilated=1
package GProperty_fn _function
symbol public misc GProperty
@ -97403,6 +97384,7 @@ package main _plain
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol private misc V
symbol private misc pr
symbol private misc err
symbol private misc holder
symbol external misc WhetherProvides --> /main/BasicInformKit/functions/WhetherProvides_fn/WhetherProvides
symbol external misc plug_00140 --> /main/generic/kinds/kind1/OBJECT_TY
@ -97412,6 +97394,7 @@ package main _plain
local K K_unchecked
local V K_unchecked
local pr K_unchecked
local err K_unchecked
local holder K_unchecked
code
inv !if
@ -97419,13 +97402,31 @@ package main _plain
val K_unchecked K
val K_unchecked V
val K_unchecked pr
val K_unchecked 1
inv !minus
val K_unchecked 1
val K_unchecked err
code
inv !ifelse
inv !eq
val K_unchecked K
val K_unchecked OBJECT_TY
code
inv !if
inv !eq
inv !lookup
val K_unchecked pr
val K_unchecked 0
val K_unchecked 2
code
inv !if
inv !has
val K_unchecked V
val K_unchecked pr
code
inv !return
val K_unchecked 1
inv !return
val K_unchecked 0
inv !if
inv !eq
val K_unchecked pr
@ -97489,12 +97490,30 @@ package main _plain
val K_unchecked K
val K_unchecked OBJECT_TY
code
inv !store
reference
inv !propertyvalue
val K_unchecked V
inv !ifelse
inv !eq
inv !lookup
val K_unchecked pr
val K_unchecked val
val K_unchecked 0
val K_unchecked 2
code
inv !ifelse
val K_unchecked val
code
inv !give
val K_unchecked V
val K_unchecked pr
code
inv !take
val K_unchecked V
val K_unchecked pr
code
inv !store
reference
inv !propertyvalue
val K_unchecked V
val K_unchecked pr
val K_unchecked val
code
inv !store
reference

View file

@ -117,8 +117,8 @@ This compiles code for the test |N has prn|, that is, compiles a condition
which is true if the value of |prn| for |N| is |true|, and correspondingly
false for |false|.
The preferred way to do this is to use the pair of functions |GetEitherOrProperty|
or |SetEitherOrProperty|, defined in //BasicInformKit//, because that way
The preferred way to do this is to use the pair of functions |GProperty|
or |WriteGProperty|, defined in //BasicInformKit//, because that way
suitable runtime problems are generated for mistaken accesses. But if we
want the fastest possible access and know that it will be valid, we can use
the following.

View file

@ -292,24 +292,24 @@ which would work just as well, but more slowly.
inter_name *identifier = RTProperties::iname(neg);
i6_schema *sch = AdjectiveMeanings::make_schema(am, TEST_ATOM_TASK);
Calculus::Schemas::modify(sch, "GetEitherOrProperty(*1, %n) == false", identifier);
Calculus::Schemas::modify(sch, "GProperty(OBJECT_TY, *1, %n, true) == false", identifier);
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_TRUE_TASK);
Calculus::Schemas::modify(sch, "SetEitherOrProperty(*1, %n, true)", identifier);
Calculus::Schemas::modify(sch, "WriteGProperty(OBJECT_TY, *1, %n, 0)", identifier);
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_FALSE_TASK);
Calculus::Schemas::modify(sch, "SetEitherOrProperty(*1, %n, false)", identifier);
Calculus::Schemas::modify(sch, "WriteGProperty(OBJECT_TY, *1, %n, 1)", identifier);
} else {
inter_name *identifier = RTProperties::iname(prn);
i6_schema *sch = AdjectiveMeanings::make_schema(am, TEST_ATOM_TASK);
Calculus::Schemas::modify(sch, "GetEitherOrProperty(*1, %n)", identifier);
Calculus::Schemas::modify(sch, "GProperty(OBJECT_TY, *1, %n, true)", identifier);
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_TRUE_TASK);
Calculus::Schemas::modify(sch, "SetEitherOrProperty(*1, %n, false)", identifier);
Calculus::Schemas::modify(sch, "WriteGProperty(OBJECT_TY, *1, %n, 1)", identifier);
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_FALSE_TASK);
Calculus::Schemas::modify(sch, "SetEitherOrProperty(*1, %n, true)", identifier);
Calculus::Schemas::modify(sch, "WriteGProperty(OBJECT_TY, *1, %n, 0)", identifier);
}
@<Set the schemata for an either/or property adjective with some other domain@> =