1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/BasicInformExtrasKit/S-at.html
2020-03-19 00:11:25 +00:00

243 lines
24 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>S/msc</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html">compiler</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html"><b>extensions and kits</b></a></li>
<li><a href="../units.html">unit test tools</a></li>
/ul>
<h2>Extensions</h2>
<ul>
<li><a href="../basic_inform/index.html">Basic Inform</a></li>
<li><a href="../standard_rules/index.html">Standard Rules</a></li>
</ul>
<h2>Kits</h2>
<ul>
<li><a href="../BasicInformKit/index.html">BasicInformKit</a></li>
<li><a href="../BasicInformExtrasKit/index.html">BasicInformExtrasKit</a></li>
<li><a href="../CommandParserKit/index.html">CommandParserKit</a></li>
<li><a href="../EnglishLanguageKit/index.html">EnglishLanguageKit</a></li>
<li><a href="../WorldModelKit/index.html">WorldModelKit</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'S/at' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">BasicInformExtrasKit</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></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">return</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="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">return</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="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="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="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-msc.html">Back to 'Miscellany'</a></li><li><i>(This section ends Sections.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>