1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/WorldModelKit/S-at2.html
2020-01-27 01:22:21 +00:00

230 lines
26 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>S/at</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of 'S/at2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">WorldModelKit</a></li><li><b>Activities Template</b></li></ul><p class="purpose">To run the necessary rulebooks to carry out an activity.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. The Activities Stack</a></li><li><a href="#SP2">&#167;2. Rule Debugging Inhibition</a></li><li><a href="#SP3">&#167;3. Testing Activities</a></li><li><a href="#SP4">&#167;4. Emptiness</a></li><li><a href="#SP5">&#167;5. Process Activity Rulebook</a></li><li><a href="#SP6">&#167;6. Carrying Out Activities</a></li><li><a href="#SP7">&#167;7. Begin</a></li><li><a href="#SP8">&#167;8. For</a></li><li><a href="#SP9">&#167;9. End</a></li><li><a href="#SP10">&#167;10. Abandon</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. The Activities Stack. </b>Activities are more like nested function calls than independent processes;
they finish in reverse order of starting, and are placed on a stack. This
needs only very limited size in practice: 20 might seem a bit low, but making
it much higher simply means that oddball bugs in the user's code &mdash; where
activities recursively cause themselves ad infinitum &mdash; will be caught less
efficiently.
</p>
<pre class="display">
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">MAX_NESTED_ACTIVITIES</span><span class="plain"> = </span><span class="constant">20</span><span class="plain">;</span>
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">activities_sp</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">activities_stack</span><span class="plain"> </span><span class="constant">--</span><span class="plain">&gt; </span><span class="identifier">MAX_NESTED_ACTIVITIES</span><span class="plain">;</span>
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">activity_parameters_stack</span><span class="plain"> </span><span class="constant">--</span><span class="plain">&gt; </span><span class="identifier">MAX_NESTED_ACTIVITIES</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Rule Debugging Inhibition. </b>The output from RULES or RULES ALL becomes totally illegible if it is applied
even to the activities printing names of objects, so this is inhibited when
any such activity is running. <code class="display"><span class="extract">FixInhibitFlag</span></code> is called each time the stack
changes and ensures that <code class="display"><span class="extract">inhibit_flag</span></code> has exactly this meaning.
</p>
<pre class="display">
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">inhibit_flag</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">saved_debug_rules</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">[ </span><span class="identifier">FixInhibitFlag</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="identifier">act</span><span class="plain"> </span><span class="identifier">inhibit_rule_debugging</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">=0:</span><span class="identifier">n</span><span class="plain">&lt;</span><span class="identifier">activities_sp</span><span class="plain">:</span><span class="identifier">n</span><span class="plain">++) {</span>
<span class="identifier">act</span><span class="plain"> = </span><span class="identifier">activities_stack</span><span class="plain">--&gt;</span><span class="identifier">n</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">act</span><span class="plain"> == </span><span class="identifier">PRINTING_THE_NAME_ACT</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">PRINTING_THE_PLURAL_NAME_ACT</span><span class="plain"> </span><span class="reserved">or</span>
<span class="identifier">PRINTING_ROOM_DESC_DETAILS_ACT</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">PRINTING_INVENTORY_DETAILS_ACT</span><span class="plain"> </span><span class="reserved">or</span>
<span class="identifier">LISTING_CONTENTS_ACT</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">GROUPING_TOGETHER_ACT</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="identifier">PRINTING_RESPONSE_ACT</span><span class="plain">)</span>
<span class="identifier">inhibit_rule_debugging</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">inhibit_flag</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">) &amp;&amp; (</span><span class="identifier">inhibit_rule_debugging</span><span class="plain">)) {</span>
<span class="identifier">saved_debug_rules</span><span class="plain"> = </span><span class="identifier">debug_rules</span><span class="plain">;</span>
<span class="identifier">debug_rules</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">inhibit_flag</span><span class="plain">) &amp;&amp; (</span><span class="identifier">inhibit_rule_debugging</span><span class="plain"> == </span><span class="reserved">false</span><span class="plain">)) {</span>
<span class="identifier">debug_rules</span><span class="plain"> = </span><span class="identifier">saved_debug_rules</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inhibit_flag</span><span class="plain"> = </span><span class="identifier">inhibit_rule_debugging</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Testing Activities. </b>The following tests whether a given activity <code class="display"><span class="extract">A</span></code> is currently running
whose parameter-object matches description <code class="display"><span class="extract">desc</span></code>, where as usual the
description is represented by a routine testing membership, and where
zero <code class="display"><span class="extract">desc</span></code> means that any parameter is valid. Alternatively, we can
require a specific parameter value of <code class="display"><span class="extract">val</span></code>.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">TestActivity</span><span class="plain"> </span><span class="identifier">A</span><span class="plain"> </span><span class="identifier">desc</span><span class="plain"> </span><span class="identifier">val</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0:</span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">activities_sp</span><span class="plain">:</span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">activities_stack</span><span class="plain">--&gt;</span><span class="identifier">i</span><span class="plain"> == </span><span class="identifier">A</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">desc</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">desc</span><span class="plain">)(</span><span class="identifier">activity_parameters_stack</span><span class="plain">--&gt;</span><span class="identifier">i</span><span class="plain">)) </span><span class="reserved">rtrue</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val</span><span class="plain"> == </span><span class="identifier">activity_parameters_stack</span><span class="plain">--&gt;</span><span class="identifier">i</span><span class="plain">) </span><span class="reserved">rtrue</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">rtrue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">rfalse</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Emptiness. </b>An activity is defined by its three rulebooks: it is empty if they are all
empty.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">ActivityEmpty</span><span class="plain"> </span><span class="identifier">A</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">Activity_before_rulebooks</span><span class="plain">--&gt;</span><span class="identifier">A</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rulebooks_array</span><span class="plain">--&gt;</span><span class="identifier">x</span><span class="plain"> ~= </span><span class="identifier">EMPTY_RULEBOOK</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">Activity_for_rulebooks</span><span class="plain">--&gt;</span><span class="identifier">A</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rulebooks_array</span><span class="plain">--&gt;</span><span class="identifier">x</span><span class="plain"> ~= </span><span class="identifier">EMPTY_RULEBOOK</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">Activity_after_rulebooks</span><span class="plain">--&gt;</span><span class="identifier">A</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rulebooks_array</span><span class="plain">--&gt;</span><span class="identifier">x</span><span class="plain"> ~= </span><span class="identifier">EMPTY_RULEBOOK</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="reserved">rtrue</span><span class="plain">;</span>
<span class="plain">];</span>
<span class="plain">[ </span><span class="identifier">RulebookEmpty</span><span class="plain"> </span><span class="identifier">rb</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rulebooks_array</span><span class="plain">--&gt;</span><span class="identifier">rb</span><span class="plain"> ~= </span><span class="identifier">EMPTY_RULEBOOK</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
<span class="reserved">rtrue</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Process Activity Rulebook. </b>This is really much like processing any rulebook, except that <code class="display"><span class="extract">self</span></code> is
temporarily set to the parameter, and is preserved by the process.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">ProcessActivityRulebook</span><span class="plain"> </span><span class="identifier">rulebook</span><span class="plain"> </span><span class="identifier">parameter</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="plain">@</span><span class="identifier">push</span><span class="plain"> </span><span class="identifier">self</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">parameter</span><span class="plain">) </span><span class="identifier">self</span><span class="plain"> = </span><span class="identifier">parameter</span><span class="plain">;</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">FollowRulebook</span><span class="plain">(</span><span class="identifier">rulebook</span><span class="plain">, </span><span class="identifier">parameter</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
<span class="plain">@</span><span class="identifier">pull</span><span class="plain"> </span><span class="identifier">self</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain">) </span><span class="reserved">rtrue</span><span class="plain">;</span>
<span class="reserved">rfalse</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Carrying Out Activities. </b>This is a three-stage process; most activities are run by calling the following
simple routine, but some are run by calling the three subroutines independently.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">CarryOutActivity</span><span class="plain"> </span><span class="identifier">A</span><span class="plain"> </span><span class="identifier">o</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="identifier">BeginActivity</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">ForActivity</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
<span class="identifier">EndActivity</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Begin. </b>Note that when an activity based on the conjectural "future action" is
being run &mdash; in a few parser-related cases, that is &mdash; the identity of this
action is put temporarily into <code class="display"><span class="extract">action</span></code>, and the current value saved while
this takes place. That allows rules in the activity rulebooks to have
preambles based on the current action, and yet be tested against what is not
yet the current action.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">BeginActivity</span><span class="plain"> </span><span class="identifier">A</span><span class="plain"> </span><span class="identifier">o</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">activities_sp</span><span class="plain"> == </span><span class="identifier">MAX_NESTED_ACTIVITIES</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_TOOMANYACTS</span><span class="plain">);</span>
<span class="identifier">activity_parameters_stack</span><span class="plain">--&gt;</span><span class="identifier">activities_sp</span><span class="plain"> = </span><span class="identifier">o</span><span class="plain">;</span>
<span class="identifier">activities_stack</span><span class="plain">--&gt;(</span><span class="identifier">activities_sp</span><span class="plain">++) = </span><span class="identifier">A</span><span class="plain">;</span>
<span class="identifier">FixInhibitFlag</span><span class="plain">();</span>
<span class="identifier">MStack_CreateAVVars</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Activity_atb_rulebooks</span><span class="plain">-&gt;</span><span class="identifier">A</span><span class="plain">) { </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">action</span><span class="plain">; </span><span class="identifier">action</span><span class="plain"> = </span><span class="identifier">action_to_be</span><span class="plain">; }</span>
<span class="identifier">o</span><span class="plain"> = </span><span class="identifier">ProcessActivityRulebook</span><span class="plain">(</span><span class="identifier">Activity_before_rulebooks</span><span class="plain">--&gt;</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Activity_atb_rulebooks</span><span class="plain">-&gt;</span><span class="identifier">A</span><span class="plain">) </span><span class="identifier">action</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">o</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. For. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">ForActivity</span><span class="plain"> </span><span class="identifier">A</span><span class="plain"> </span><span class="identifier">o</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Activity_atb_rulebooks</span><span class="plain">-&gt;</span><span class="identifier">A</span><span class="plain">) { </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">action</span><span class="plain">; </span><span class="identifier">action</span><span class="plain"> = </span><span class="identifier">action_to_be</span><span class="plain">; }</span>
<span class="identifier">o</span><span class="plain"> = </span><span class="identifier">ProcessActivityRulebook</span><span class="plain">(</span><span class="identifier">Activity_for_rulebooks</span><span class="plain">--&gt;</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Activity_atb_rulebooks</span><span class="plain">-&gt;</span><span class="identifier">A</span><span class="plain">) </span><span class="identifier">action</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">o</span><span class="plain">;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. End. </b></p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">EndActivity</span><span class="plain"> </span><span class="identifier">A</span><span class="plain"> </span><span class="identifier">o</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">activities_sp</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">activities_stack</span><span class="plain">--&gt;(</span><span class="identifier">activities_sp</span><span class="plain">-1) == </span><span class="identifier">A</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Activity_atb_rulebooks</span><span class="plain">-&gt;</span><span class="identifier">A</span><span class="plain">) { </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">action</span><span class="plain">; </span><span class="identifier">action</span><span class="plain"> = </span><span class="identifier">action_to_be</span><span class="plain">; }</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">ProcessActivityRulebook</span><span class="plain">(</span><span class="identifier">Activity_after_rulebooks</span><span class="plain">--&gt;</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">o</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Activity_atb_rulebooks</span><span class="plain">-&gt;</span><span class="identifier">A</span><span class="plain">) </span><span class="identifier">action</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">;</span>
<span class="identifier">activities_sp</span><span class="plain">--; </span><span class="identifier">FixInhibitFlag</span><span class="plain">();</span>
<span class="identifier">MStack_DestroyAVVars</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_CANTABANDON</span><span class="plain">);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Abandon. </b>For (very) rare cases where an activity must be abandoned midway; such an
activity must be being run by calling the three stages individually, and
<code class="display"><span class="extract">EndActivity</span></code> must not have been called yet.
</p>
<pre class="display">
<span class="plain">[ </span><span class="identifier">AbandonActivity</span><span class="plain"> </span><span class="identifier">A</span><span class="plain"> </span><span class="identifier">o</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">activities_sp</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">activities_stack</span><span class="plain">--&gt;(</span><span class="identifier">activities_sp</span><span class="plain">-1) == </span><span class="identifier">A</span><span class="plain">)) {</span>
<span class="identifier">activities_sp</span><span class="plain">--; </span><span class="identifier">FixInhibitFlag</span><span class="plain">();</span>
<span class="identifier">MStack_DestroyAVVars</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">RunTimeProblem</span><span class="plain">(</span><span class="identifier">RTP_CANTEND</span><span class="plain">);</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="S-at.html">Back to 'Actions Template'</a></li><li><a href="S-ft.html">Continue with 'Figures Template'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>