1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-01 07:48:35 +03:00
inform7/docs/core-module/21-ac.html
2019-04-16 08:15:15 +01:00

933 lines
128 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>21/sv</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 '21/ac' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#21">Chapter 21: Rules and Rulebooks</a></li><li><b>Activities</b></li></ul><p class="purpose">To create and manage activities, which are action-like bundles of rules controlling how the I6 runtime code carries out tasks such as "printing the name of something". Each has its own page in the I7 documentation. An activity list is a disjunction of actitivies.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP7">&#167;7. Activity variables</a></li><li><a href="#SP9">&#167;9. Activity indexing</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct activity</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">name</span><span class="plain">; </span> <span class="comment">text of the name of the activity</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">before_rules</span><span class="plain">; </span> <span class="comment">rulebooks for when this is followed</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">for_rules</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">after_rules</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">activity_on_what_kind</span><span class="plain">; </span> <span class="comment">or null</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">stacked_variable_owner</span><span class="plain"> *</span><span class="identifier">owned_by_av</span><span class="plain">; </span> <span class="comment">activity variables owned here</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">av_package</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">av_iname</span><span class="plain">; </span> <span class="comment">an identifier for a constant identifying this</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">av_documentation_symbol</span><span class="plain">; </span> <span class="comment">cross-reference to HTML documentation, if any</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">activity_indexed</span><span class="plain">; </span> <span class="comment">has this been indexed yet?</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">activity_crossref</span><span class="plain"> *</span><span class="identifier">cross_references</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">}</span><span class="reserved"> activity</span><span class="plain">;</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">activity_list</span><span class="plain"> {</span>
<span class="reserved">struct activity</span><span class="plain"> </span><span class="reserved">*activity</span><span class="plain">; </span> <span class="comment">what activity</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">acting_on</span><span class="plain">; </span> <span class="comment">the parameter</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">only_when</span><span class="plain">; </span> <span class="comment">condition for when this applies</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ACL_parity</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">+1</span></code> if meant positively, <code class="display"><span class="extract">-1</span></code> if negatively</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">activity_list</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">; </span> <span class="comment">next in activity list</span>
<span class="plain">} </span><span class="reserved">activity_list</span><span class="plain">;</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">activity_crossref</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">rule_dependent</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">activity_crossref</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">activity_crossref</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure activity is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
<p class="endnote">The structure activity_list is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/is, 27/cm and here.</p>
<p class="endnote">The structure activity_crossref is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/is, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">STARTING_VIRTUAL_MACHINE_ACT</span><span class="plain"> 0</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_RESPONSE_ACT</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_THE_NAME_ACT</span><span class="plain"> 2</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_THE_PLURAL_NAME_ACT</span><span class="plain"> 3</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_A_NUMBER_OF_ACT</span><span class="plain"> 4</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_ROOM_DESC_DETAILS_ACT</span><span class="plain"> 5</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_INVENTORY_DETAILS_ACT</span><span class="plain"> 6</span>
<span class="definitionkeyword">define</span> <span class="constant">LISTING_CONTENTS_ACT</span><span class="plain"> 7</span>
<span class="definitionkeyword">define</span> <span class="constant">GROUPING_TOGETHER_ACT</span><span class="plain"> 8</span>
<span class="definitionkeyword">define</span> <span class="constant">WRITING_A_PARAGRAPH_ABOUT_ACT</span><span class="plain"> 9</span>
<span class="definitionkeyword">define</span> <span class="constant">LISTING_NONDESCRIPT_ITEMS_ACT</span><span class="plain"> 10</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_NAME_OF_DARK_ROOM_ACT</span><span class="plain"> 11</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_DESC_OF_DARK_ROOM_ACT</span><span class="plain"> 12</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_NEWS_OF_DARKNESS_ACT</span><span class="plain"> 13</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_NEWS_OF_LIGHT_ACT</span><span class="plain"> 14</span>
<span class="definitionkeyword">define</span> <span class="constant">REFUSAL_TO_ACT_IN_DARK_ACT</span><span class="plain"> 15</span>
<span class="definitionkeyword">define</span> <span class="constant">CONSTRUCTING_STATUS_LINE_ACT</span><span class="plain"> 16</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_BANNER_TEXT_ACT</span><span class="plain"> 17</span>
<span class="definitionkeyword">define</span> <span class="constant">READING_A_COMMAND_ACT</span><span class="plain"> 18</span>
<span class="definitionkeyword">define</span> <span class="constant">DECIDING_SCOPE_ACT</span><span class="plain"> 19</span>
<span class="definitionkeyword">define</span> <span class="constant">DECIDING_CONCEALED_POSSESS_ACT</span><span class="plain"> 20</span>
<span class="definitionkeyword">define</span> <span class="constant">DECIDING_WHETHER_ALL_INC_ACT</span><span class="plain"> 21</span>
<span class="definitionkeyword">define</span> <span class="constant">CLARIFYING_PARSERS_CHOICE_ACT</span><span class="plain"> 22</span>
<span class="definitionkeyword">define</span> <span class="constant">ASKING_WHICH_DO_YOU_MEAN_ACT</span><span class="plain"> 23</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_A_PARSER_ERROR_ACT</span><span class="plain"> 24</span>
<span class="definitionkeyword">define</span> <span class="constant">SUPPLYING_A_MISSING_NOUN_ACT</span><span class="plain"> 25</span>
<span class="definitionkeyword">define</span> <span class="constant">SUPPLYING_A_MISSING_SECOND_ACT</span><span class="plain"> 26</span>
<span class="definitionkeyword">define</span> <span class="constant">IMPLICITLY_TAKING_ACT</span><span class="plain"> 27</span>
<span class="definitionkeyword">define</span> <span class="constant">AMUSING_A_VICTORIOUS_PLAYER_ACT</span><span class="plain"> 28</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_PLAYERS_OBITUARY_ACT</span><span class="plain"> 29</span>
<span class="definitionkeyword">define</span> <span class="constant">DEALING_WITH_FINAL_QUESTION_ACT</span><span class="plain"> 30</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_LOCALE_DESCRIPTION_ACT</span><span class="plain"> 31</span>
<span class="definitionkeyword">define</span> <span class="constant">CHOOSING_NOTABLE_LOCALE_OBJ_ACT</span><span class="plain"> 32</span>
<span class="definitionkeyword">define</span> <span class="constant">PRINTING_LOCALE_PARAGRAPH_ACT</span><span class="plain"> 33</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>We give a special meaning to the sentence "X is an activity", where no kind
is specified, since this would otherwise not be legal Inform.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">bare</span><span class="reserved">-activity</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">article</span><span class="plain">&gt;</span><span class="reserved"> activity</span><span class="plain"> | ==&gt; </span><span class="identifier">TRUE</span>
<span class="reserved">activity</span><span class="plain"> ==&gt; </span><span class="identifier">TRUE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Activities::new_activity_SMF</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">task</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> *</span><span class="identifier">NPs</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">SW</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[0]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[1]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">task</span><span class="plain">) { </span> <span class="comment">"Description is an activity."</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ACCEPT_SMFT</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">bare</span><span class="reserved">-activity</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;(</span><span class="identifier">OW</span><span class="plain">)) {</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="constant">verb_id_ANNOT</span><span class="plain">, </span><span class="constant">SPECIAL_MEANING_VB</span><span class="plain">);</span>
<span class="plain">&lt;</span><span class="identifier">nounphrase</span><span class="plain">&gt;(</span><span class="identifier">SW</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="plain">&lt;</span><span class="identifier">nounphrase</span><span class="plain">&gt;(</span><span class="identifier">OW</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TRAVERSE1_SMFT</span><span class="plain">:</span>
<span class="functiontext">Activities::new</span><span class="plain">(</span><span class="identifier">Kinds::unary_construction</span><span class="plain">(</span><span class="identifier">CON_activity</span><span class="plain">, </span><span class="identifier">K_nil</span><span class="plain">),</span>
<span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">));</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Activities::new_activity_SMF is used in 6/nv (<a href="6-nv.html#SP16">&#167;16</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Activities are much simpler to create than actions. For example,
</p>
<blockquote>
<p>Announcing something is an activity on numbers.</p>
</blockquote>
<p class="inwebparagraph">The object phrase (here "an activity on numbers") is required to match
&lt;k-kind&gt; and, moreover, to be an activity kind, but we don't parse it
here. What we do instead is to work on the subject phrase (here "announcing
something"):
</p>
<pre class="display">
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt; ::=</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">noted</span><span class="plain">&gt; ( &lt;</span><span class="identifier">documentation</span><span class="plain">-</span><span class="identifier">symbol</span><span class="plain">&gt; ) | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ds</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">noted</span><span class="plain">&gt; -- &lt;</span><span class="identifier">documentation</span><span class="plain">-</span><span class="identifier">symbol</span><span class="plain">&gt; -- | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ds</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">noted</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ds</span><span class="plain">&gt;&gt; = -1;</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">noted</span><span class="plain">&gt; ::=</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ( </span><span class="identifier">future</span><span class="plain"> </span><span class="identifier">action</span><span class="plain"> ) | ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; &lt;&lt;</span><span class="identifier">future</span><span class="plain">&gt;&gt; = </span><span class="identifier">TRUE</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ( ... ) | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_ActivityNoteUnknown problem</span> <span class="cwebmacronumber">5.2</span>&gt;
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; &lt;&lt;</span><span class="identifier">future</span><span class="plain">&gt;&gt; = </span><span class="identifier">FALSE</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ::=</span>
<span class="plain">... </span><span class="identifier">of</span><span class="plain">/</span><span class="reserved">for</span><span class="plain"> </span><span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> | ==&gt; 0; &lt;&lt;</span><span class="identifier">any</span><span class="plain">&gt;&gt; = </span><span class="identifier">TRUE</span>
<span class="plain">... </span><span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> | ==&gt; 0; &lt;&lt;</span><span class="identifier">any</span><span class="plain">&gt;&gt; = </span><span class="identifier">TRUE</span>
<span class="plain">... ==&gt; 0; &lt;&lt;</span><span class="identifier">any</span><span class="plain">&gt;&gt; = </span><span class="identifier">FALSE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b>Once a new activity has been created, the following is used to make a
noun for it; for example, the "announcing activity".
</p>
<pre class="display">
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">construction</span><span class="plain">&gt; ::=</span>
<span class="plain">...</span><span class="element"> activity</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5_2"></a><b>&#167;5.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_ActivityNoteUnknown problem</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActivityNoteUnknown</span><span class="plain">),</span>
<span class="string">"one of the notes about this activity makes no sense"</span><span class="plain">,</span>
<span class="string">"and should be either 'documented at SYMBOL' or 'future action'."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display">
<span class="reserved">activity</span><span class="plain"> *</span><span class="functiontext">Activities::new</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">creation_kind</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="reserved">(activity</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">future_action_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">;</span>
<span class="identifier">creation_kind</span><span class="plain"> = </span><span class="identifier">Kinds::unary_construction_material</span><span class="plain">(</span><span class="identifier">creation_kind</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Behaviour::definite</span><span class="plain">(</span><span class="identifier">creation_kind</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">creation_kind</span><span class="plain">, </span><span class="identifier">K_nil</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"I'm reading the kind as: $u\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">creation_kind</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActivityIndefinite</span><span class="plain">),</span>
<span class="string">"this is an activity on a kind which isn't definite"</span><span class="plain">,</span>
<span class="string">"and doesn't tell me enough about what sort of value the activity "</span>
<span class="string">"should work on. For example, 'Divining is an activity on numbers' "</span>
<span class="string">"is fine because 'numbers' is definite, but 'Divining is an "</span>
<span class="string">"activity on values' is not allowed."</span><span class="plain">);</span>
<span class="identifier">creation_kind</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(</span><span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;, 1);</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_documentation_symbol</span><span class="plain"> = </span><span class="identifier">Wordings::one_word</span><span class="plain">(&lt;&lt;</span><span class="identifier">ds</span><span class="plain">&gt;&gt;);</span>
<span class="identifier">future_action_flag</span><span class="plain"> = &lt;&lt;</span><span class="identifier">future</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">any</span><span class="plain">&gt;&gt;) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">creation_kind</span><span class="plain">, </span><span class="identifier">K_nil</span><span class="plain">)) </span><span class="identifier">creation_kind</span><span class="plain"> = </span><span class="identifier">K_object</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">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">creation_kind</span><span class="plain">, </span><span class="identifier">K_nil</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActivityMisnamed</span><span class="plain">),</span>
<span class="string">"the name of this activity implies that it acts on nothing"</span><span class="plain">,</span>
<span class="string">"which doesn't fit with what you say about it. For example, "</span>
<span class="string">"'Painting is an activity on brushes' isn't allowed because "</span>
<span class="string">"the activity's name doesn't end with 'something': it should "</span>
<span class="string">"be 'Painting something is an activity on brushes'."</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_package</span><span class="plain"> = </span><span class="functiontext">Hierarchy::local_package</span><span class="plain">(</span><span class="constant">ACTIVITIES_HAP</span><span class="plain">);</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_with_memo</span><span class="plain">(</span><span class="constant">ACTIVITY_HL</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_package</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Packaging::enter_home_of</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_iname</span><span class="plain">);</span>
<span class="functiontext">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_iname</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">av</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="functiontext">Packaging::exit</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_CREATIONS</span><span class="plain">, </span><span class="string">"Created activity: %n = %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_iname</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;activity_on_what_kind</span><span class="plain"> = </span><span class="identifier">creation_kind</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">&gt;(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) </span><span class="identifier">spec</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">spec</span><span class="plain"> = </span><span class="functiontext">Specifications::new_UNKNOWN</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (!(</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="constant">UNKNOWN_NT</span><span class="plain">)) &amp;&amp; (!(</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="constant">PROPERTY_VALUE_NT</span><span class="plain">)))) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%W means $P\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadActivityName</span><span class="plain">),</span>
<span class="string">"this already has a meaning"</span><span class="plain">,</span>
<span class="string">"and so cannot be the name of a newly created activity."</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Nouns::new_proper_noun</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">NEUTER_GENDER</span><span class="plain">,</span>
<span class="identifier">REGISTER_SINGULAR_NTOPT</span><span class="plain"> + </span><span class="identifier">PARSE_EXACTLY_NTOPT</span><span class="plain">,</span>
<span class="constant">ACTIVITY_MC</span><span class="plain">, </span><span class="functiontext">Rvalues::from_activity</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">));</span>
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">wa</span><span class="plain"> =</span>
<span class="identifier">Preform::Nonparsing::merge</span><span class="plain">(</span><span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">construction</span><span class="plain">&gt;, 0,</span>
<span class="identifier">WordAssemblages::from_wording</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">));</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">WordAssemblages::to_wording</span><span class="plain">(&amp;</span><span class="identifier">wa</span><span class="plain">);</span>
<span class="identifier">Nouns::new_proper_noun</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">, </span><span class="identifier">NEUTER_GENDER</span><span class="plain">,</span>
<span class="identifier">REGISTER_SINGULAR_NTOPT</span><span class="plain"> + </span><span class="identifier">PARSE_EXACTLY_NTOPT</span><span class="plain">,</span>
<span class="constant">ACTIVITY_MC</span><span class="plain">, </span><span class="functiontext">Rvalues::from_activity</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="identifier">feed_t</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
<span class="identifier">Feeds::feed_text_expanding_strings</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"before"</span><span class="plain">);</span>
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">SW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">BR</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_package_in</span><span class="plain">(</span><span class="constant">BEFORE_RB_HL</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_package</span><span class="plain">);</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;before_rules</span><span class="plain"> =</span>
<span class="functiontext">Rulebooks::new_automatic</span><span class="plain">(</span><span class="identifier">SW</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;activity_on_what_kind</span><span class="plain">,</span>
<span class="constant">NO_OUTCOME</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">future_action_flag</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">BR</span><span class="plain">);</span>
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
<span class="identifier">Feeds::feed_text_expanding_strings</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"for"</span><span class="plain">);</span>
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="identifier">SW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">FR</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_package_in</span><span class="plain">(</span><span class="constant">FOR_RB_HL</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_package</span><span class="plain">);</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;for_rules</span><span class="plain"> =</span>
<span class="functiontext">Rulebooks::new_automatic</span><span class="plain">(</span><span class="identifier">SW</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;activity_on_what_kind</span><span class="plain">,</span>
<span class="constant">SUCCESS_OUTCOME</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">future_action_flag</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">FR</span><span class="plain">);</span>
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
<span class="identifier">Feeds::feed_text_expanding_strings</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"after"</span><span class="plain">);</span>
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="identifier">SW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">AR</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_package_in</span><span class="plain">(</span><span class="constant">AFTER_RB_HL</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_package</span><span class="plain">);</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;after_rules</span><span class="plain"> =</span>
<span class="functiontext">Rulebooks::new_automatic</span><span class="plain">(</span><span class="identifier">SW</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;activity_on_what_kind</span><span class="plain">,</span>
<span class="constant">NO_OUTCOME</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">future_action_flag</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">AR</span><span class="plain">);</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;owned_by_av</span><span class="plain"> = </span><span class="functiontext">StackedVariables::new_owner</span><span class="plain">(10000+</span><span class="identifier">av</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::make_stvs_accessible</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;before_rules</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;owned_by_av</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::make_stvs_accessible</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;for_rules</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;owned_by_av</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::make_stvs_accessible</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;after_rules</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;owned_by_av</span><span class="plain">);</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;activity_indexed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;cross_references</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">av</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Activities::to_kind</span><span class="reserved">(activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Kinds::unary_construction</span><span class="plain">(</span><span class="identifier">CON_activity</span><span class="plain">,</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;activity_on_what_kind</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Activities::new is used in <a href="#SP4">&#167;4</a>, 9/tc (<a href="9-tc.html#SP5_4_2_5">&#167;5.4.2.5</a>).</p>
<p class="endnote">The function Activities::to_kind is used in 14/rv (<a href="14-rv.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Activity variables. </b>Any new activity variable name is vetted by being run through this:
</p>
<pre class="display">
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">unfortunate</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_ActivityVarAnd problem</span> <span class="cwebmacronumber">7.1</span>&gt;
<span class="plain">... ==&gt; </span><span class="identifier">TRUE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_ActivityVarAnd problem</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActivityVarAnd</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1, which I am reading as a request to make "</span>
<span class="string">"a new named variable for an activity - a value associated "</span>
<span class="string">"with a activity and which has a name. The request seems to "</span>
<span class="string">"say that the name in question is '%2', but I'd prefer to "</span>
<span class="string">"avoid 'and', 'or', 'with', or 'having' in such names, please."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::add_variable</span><span class="reserved">(activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">cnode</span><span class="plain">) {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">) != </span><span class="constant">PROPERTYCALLED_NT</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">) != </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">)) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Tree: $T\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">cnode</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"ac_add_variable on a node of unknown type"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">) == </span><span class="identifier">PROPER_NOUN_NT</span><span class="plain">) {</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActivityVariableNameless</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1, which I am reading as a request to make "</span>
<span class="string">"a new named variable for an activity - a value associated "</span>
<span class="string">"with a activity and which has a name. Here, though, there "</span>
<span class="string">"seems to be no name for the variable as such, only an indication "</span>
<span class="string">"of its kind. Try something like 'The printing the banner text "</span>
<span class="string">"activity has a number called the accumulated vanity'."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">type</span><span class="plain">-</span><span class="identifier">expression</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">))) </span><span class="identifier">spec</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; == </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_description</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Descriptions::number_of_adjectives_applied_to</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">) == 0)) {</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">));</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActivityVarOverspecific</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1, which I am reading as a request to make "</span>
<span class="string">"a new named variable for an activity - a value associated "</span>
<span class="string">"with a activity and which has a name. The request seems to "</span>
<span class="string">"say that the value in question is '%2', but this is too "</span>
<span class="string">"specific a description. (Instead, a kind of value "</span>
<span class="string">"(such as 'number') or a kind of object (such as 'room' "</span>
<span class="string">"or 'thing') should be given. To get a property whose "</span>
<span class="string">"contents can be any kind of object, use 'object'.)"</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (!(</span><span class="functiontext">Specifications::is_kind_like</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">))) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Offending SP: $T"</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">));</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActivityVarUnknownKOV</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1, but '%2' is not the name of a kind of "</span>
<span class="string">"value which I know (such as 'number' or 'text')."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">), </span><span class="identifier">K_value</span><span class="plain">)) {</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">));</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ActivityVarValue</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"You wrote %1, but saying that a variable is a 'value' "</span>
<span class="string">"does not give me a clear enough idea what it will hold. "</span>
<span class="string">"You need to say what kind of value: for instance, 'A door "</span>
<span class="string">"has a number called street address.' is allowed because "</span>
<span class="string">"'number' is specific about the kind of value."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">StackedVariables::add_empty</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;owned_by_av</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">),</span>
<span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::activity_var_creators</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">StackedVariables::owner_empty</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;owned_by_av</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">ACTIVITY_STV_CREATOR_FN_HL</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_package</span><span class="plain">);</span>
<span class="functiontext">StackedVariables::compile_frame_creator</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;owned_by_av</span><span class="plain">, </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">ACTIVITY_VAR_CREATORS_HL</span><span class="plain">);</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Packaging::enter_home_of</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="functiontext">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">StackedVariables::owner_empty</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;owned_by_av</span><span class="plain">)) </span><span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Emit::array_iname_entry</span><span class="plain">(</span><span class="functiontext">StackedVariables::frame_creator</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;owned_by_av</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="functiontext">Emit::array_end</span><span class="plain">();</span>
<span class="functiontext">Packaging::exit</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Activities::add_variable is used in 9/ma (<a href="9-ma.html#SP3_3_25_1">&#167;3.3.25.1</a>).</p>
<p class="endnote">The function Activities::activity_var_creators is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Activity indexing. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::index_by_number</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">indent</span><span class="plain">) {</span>
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">av</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain"> == </span><span class="identifier">id</span><span class="plain">) </span><span class="functiontext">Activities::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">, </span><span class="identifier">indent</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::index</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">indent</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">empty</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;activity_indexed</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;activity_indexed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rulebooks::is_empty</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;before_rules</span><span class="plain">, </span><span class="functiontext">Rulebooks::no_rule_context</span><span class="plain">()) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">empty</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rulebooks::is_empty</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;for_rules</span><span class="plain">, </span><span class="functiontext">Rulebooks::no_rule_context</span><span class="plain">()) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">empty</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rulebooks::is_empty</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;after_rules</span><span class="plain">, </span><span class="functiontext">Rulebooks::no_rule_context</span><span class="plain">()) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">empty</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;cross_references</span><span class="plain">) </span><span class="identifier">empty</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">doc_link</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_documentation_symbol</span><span class="plain">))</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">doc_link</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_documentation_symbol</span><span class="plain">)));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">empty</span><span class="plain">) </span><span class="identifier">text</span><span class="plain"> = </span><span class="string">"There are no rules before, for or after this activity."</span><span class="plain">;</span>
<span class="functiontext">Rulebooks::index_rules_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">, </span><span class="identifier">doc_link</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">indent</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">doc_link</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Activities::no_rules</span><span class="reserved">(activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = 0;</span>
<span class="identifier">t</span><span class="plain"> += </span><span class="functiontext">Rulebooks::no_rules</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;before_rules</span><span class="plain">);</span>
<span class="identifier">t</span><span class="plain"> += </span><span class="functiontext">Rulebooks::no_rules</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;for_rules</span><span class="plain">);</span>
<span class="identifier">t</span><span class="plain"> += </span><span class="functiontext">Rulebooks::no_rules</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;after_rules</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::index_details</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ignore_me</span><span class="plain"> = 0;</span>
<span class="functiontext">Rulebooks::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;before_rules</span><span class="plain">, </span><span class="string">"before"</span><span class="plain">, </span><span class="functiontext">Rulebooks::no_rule_context</span><span class="plain">(), &amp;</span><span class="identifier">ignore_me</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;for_rules</span><span class="plain">, </span><span class="string">"for"</span><span class="plain">, </span><span class="functiontext">Rulebooks::no_rule_context</span><span class="plain">(), &amp;</span><span class="identifier">ignore_me</span><span class="plain">);</span>
<span class="functiontext">Rulebooks::index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;after_rules</span><span class="plain">, </span><span class="string">"after"</span><span class="plain">, </span><span class="functiontext">Rulebooks::no_rule_context</span><span class="plain">(), &amp;</span><span class="identifier">ignore_me</span><span class="plain">);</span>
<span class="functiontext">Activities::index_cross_references</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">av</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">Activities::iname</span><span class="reserved">(activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;av_iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Activities::count_list</span><span class="plain">(</span><span class="reserved">activity_list</span><span class="plain"> *</span><span class="identifier">avl</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = 0;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">avl</span><span class="plain">) {</span>
<span class="identifier">n</span><span class="plain"> += 10;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">avl</span><span class="plain">-</span><span class="element">&gt;only_when</span><span class="plain">) </span><span class="identifier">n</span><span class="plain"> += </span><span class="functiontext">Conditions::count</span><span class="plain">(</span><span class="identifier">avl</span><span class="plain">-</span><span class="element">&gt;only_when</span><span class="plain">);</span>
<span class="identifier">avl</span><span class="plain"> = </span><span class="identifier">avl</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Activities::index_by_number is used in 21/rl2 (<a href="21-rl2.html#SP23_1">&#167;23.1</a>, <a href="21-rl2.html#SP23_3">&#167;23.3</a>, <a href="21-rl2.html#SP23_6">&#167;23.6</a>, <a href="21-rl2.html#SP23_8">&#167;23.8</a>, <a href="21-rl2.html#SP23_9">&#167;23.9</a>).</p>
<p class="endnote">The function Activities::index is used in 21/rl2 (<a href="21-rl2.html#SP23_10_1">&#167;23.10.1</a>).</p>
<p class="endnote">The function Activities::no_rules is used in 21/rl2 (<a href="21-rl2.html#SP24">&#167;24</a>).</p>
<p class="endnote">The function Activities::index_details is used in 21/rl2 (<a href="21-rl2.html#SP24">&#167;24</a>).</p>
<p class="endnote">The function Activities::iname is used in 14/rv (<a href="14-rv.html#SP24_3">&#167;24.3</a>).</p>
<p class="endnote">The function Activities::count_list is used in 22/prcd (<a href="22-prcd.html#SP8_4">&#167;8.4</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Run-time contexts are seen in the "while" clauses at the end of rules.
For example:
</p>
<blockquote>
<p>Rule for printing the name of the lemon sherbet while listing contents: ...</p>
</blockquote>
<p class="inwebparagraph">Here "listing contents" is the context. These are like action patterns, but
much simpler to parse &mdash; an or-divided list of activities can be given, with or
without operands; "not" can be used to negate the list; and ordinary
conditions are also allowed, as here:
</p>
<blockquote>
<p>Rule for printing the name of the sack while the sack is not carried: ...</p>
</blockquote>
<p class="inwebparagraph">where "the sack is not carried" is also a &lt;run-time-context&gt; even though
it mentions no activities.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">run</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">-</span><span class="identifier">context</span><span class="plain">&gt; ::=</span>
<span class="identifier">not</span><span class="plain"> </span><span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">-</span><span class="identifier">unnegated</span><span class="plain">&gt; | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span>&lt;<span class="cwebmacro">Flip the activity list parities</span> <span class="cwebmacronumber">10.2</span>&gt;<span class="plain">;</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">-</span><span class="identifier">unnegated</span><span class="plain">&gt; ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">-</span><span class="identifier">unnegated</span><span class="plain">&gt; ::=</span>
<span class="plain">... | ==&gt; 0; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">preform_lookahead_mode</span><span class="plain">; </span> <span class="comment">match only when looking ahead</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; </span><span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Join the activity lists</span> <span class="cwebmacronumber">10.3</span>&gt;<span class="plain">;</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">&gt; ::=</span>
<span class="plain">, </span><span class="identifier">_or</span><span class="plain"> &lt;</span><span class="identifier">run</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">-</span><span class="identifier">context</span><span class="plain">&gt; | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
<span class="identifier">_</span><span class="plain">,/</span><span class="identifier">or</span><span class="plain"> &lt;</span><span class="identifier">run</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">-</span><span class="identifier">context</span><span class="plain">&gt; ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; ::=</span>
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Make one-entry AL without operand</span> <span class="cwebmacronumber">10.4</span>&gt;
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; </span><span class="identifier">of</span><span class="plain">/</span><span class="reserved">for</span><span class="plain"> </span><span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Make one-entry AL with operand</span> <span class="cwebmacronumber">10.5</span>&gt;
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; </span><span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Make one-entry AL with operand</span> <span class="cwebmacronumber">10.5</span>&gt;
<span class="plain">^&lt;</span><span class="reserved">if</span><span class="plain">-</span><span class="identifier">parsing</span><span class="plain">-</span><span class="identifier">al</span><span class="plain">-</span><span class="identifier">conditions</span><span class="plain">&gt; ... | ==&gt; </span>&lt;<span class="cwebmacro">Make one-entry AL with unparsed text</span> <span class="cwebmacronumber">10.6</span>&gt;
<span class="plain">&lt;</span><span class="reserved">if</span><span class="plain">-</span><span class="identifier">parsing</span><span class="plain">-</span><span class="identifier">al</span><span class="plain">-</span><span class="identifier">conditions</span><span class="plain">&gt; &lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">condition</span><span class="plain">&gt; ==&gt; </span>&lt;<span class="cwebmacro">Make one-entry AL with condition</span> <span class="cwebmacronumber">10.7</span>&gt;
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10_1"></a><b>&#167;10.1. </b>The optional operand handles "something" itself in productions (a) and (b)
in order to prevent it from being read as a description at production (c). This
prevents "something" from being read as "some thing", that is, it prevents
Inform from thinking that the operand value must have kind "thing".
</p>
<p class="inwebparagraph">If we do reach (c), the expression is required to be a value, or description of
values, of the kind to which the activity applies.
</p>
<pre class="display">
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">&gt; ::=</span>
<span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> | ==&gt; </span><span class="identifier">FALSE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">Specifications::new_UNKNOWN</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> </span><span class="reserved">else</span><span class="plain"> | ==&gt; </span><span class="identifier">FALSE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">Specifications::new_UNKNOWN</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">type</span><span class="plain">-</span><span class="identifier">expression</span><span class="plain">-</span><span class="identifier">or</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">&gt; ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10_2"></a><b>&#167;10.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Flip the activity list parities</span> <span class="cwebmacronumber">10.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">activity_list</span><span class="plain"> *</span><span class="identifier">al</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">al</span><span class="plain">; </span><span class="identifier">al</span><span class="plain">=</span><span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">) {</span>
<span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;ACL_parity</span><span class="plain"> = (</span><span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;ACL_parity</span><span class="plain">)?</span><span class="identifier">FALSE</span><span class="plain">:</span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP10_3"></a><b>&#167;10.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Join the activity lists</span> <span class="cwebmacronumber">10.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">activity_list</span><span class="plain"> *</span><span class="identifier">al1</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1], *</span><span class="identifier">al2</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
<span class="identifier">al1</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = </span><span class="identifier">al2</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">al1</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP10_4"></a><b>&#167;10.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make one-entry AL without operand</span> <span class="cwebmacronumber">10.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">activity_list</span><span class="plain"> *</span><span class="identifier">al</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Make one-entry AL</span> <span class="cwebmacronumber">10.4.1</span>&gt;<span class="plain">;</span>
<span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;activity</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP10_5"></a><b>&#167;10.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make one-entry AL with operand</span> <span class="cwebmacronumber">10.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;activity_on_what_kind</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">R</span><span class="plain">[2]) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Dash::validate_parameter</span><span class="plain">(</span><span class="identifier">RP</span><span class="plain">[2], </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;activity_on_what_kind</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">activity_list</span><span class="plain"> *</span><span class="identifier">al</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Make one-entry AL</span> <span class="cwebmacronumber">10.4.1</span>&gt;<span class="plain">;</span>
<span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;activity</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">;</span>
<span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;acting_on</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a> (twice).</p>
<p class="inwebparagraph"><a id="SP10_6"></a><b>&#167;10.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make one-entry AL with unparsed text</span> <span class="cwebmacronumber">10.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">cond</span><span class="plain"> = </span><span class="functiontext">Specifications::new_UNKNOWN</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">);</span>
<span class="reserved">activity_list</span><span class="plain"> *</span><span class="identifier">al</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Make one-entry AL</span> <span class="cwebmacronumber">10.4.1</span>&gt;<span class="plain">;</span>
<span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;only_when</span><span class="plain"> = </span><span class="identifier">cond</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP10_7"></a><b>&#167;10.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make one-entry AL with condition</span> <span class="cwebmacronumber">10.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">cond</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Dash::validate_conditional_clause</span><span class="plain">(</span><span class="identifier">cond</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">activity_list</span><span class="plain"> *</span><span class="identifier">al</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Make one-entry AL</span> <span class="cwebmacronumber">10.4.1</span>&gt;<span class="plain">;</span>
<span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;only_when</span><span class="plain"> = </span><span class="identifier">cond</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP10_4_1"></a><b>&#167;10.4.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make one-entry AL</span> <span class="cwebmacronumber">10.4.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">al</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">activity_list</span><span class="plain">);</span>
<span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;acting_on</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;only_when</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;ACL_parity</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;activity</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">al</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10_4">&#167;10.4</a>, <a href="#SP10_5">&#167;10.5</a>, <a href="#SP10_6">&#167;10.6</a>, <a href="#SP10_7">&#167;10.7</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>And this parses individual activity names.
</p>
<pre class="display">
<span class="reserved">&lt;activity</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; </span><span class="identifier">internal</span><span class="plain"> {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">ExParser::parse_excerpt</span><span class="plain">(</span><span class="constant">ACTIVITY_MC</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_construction</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">CON_activity</span><span class="plain">)) {</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_activity</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">parsing_al_conditions</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">activity_list</span><span class="plain"> *</span><span class="functiontext">Activities::parse_list</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Activities::parse_list_inner</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Activities::parse_list is used in 22/prcd (<a href="22-prcd.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>It's convenient not to look too closely at the condition sometimes.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="reserved">if</span><span class="plain">-</span><span class="identifier">parsing</span><span class="plain">-</span><span class="identifier">al</span><span class="plain">-</span><span class="identifier">conditions</span><span class="plain">&gt; </span><span class="identifier">internal</span><span class="plain"> 0 {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">parsing_al_conditions</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>All of which sets up the context for:
</p>
<pre class="display">
<span class="reserved">activity_list</span><span class="plain"> *</span><span class="functiontext">Activities::parse_list_inner</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">save_pac</span><span class="plain"> = </span><span class="identifier">parsing_al_conditions</span><span class="plain">;</span>
<span class="identifier">parsing_al_conditions</span><span class="plain"> = </span><span class="identifier">state</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = &lt;</span><span class="identifier">run</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">-</span><span class="identifier">context</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">parsing_al_conditions</span><span class="plain"> = </span><span class="identifier">save_pac</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">return</span><span class="plain"> &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::emit_activity_list</span><span class="plain">(</span><span class="reserved">activity_list</span><span class="plain"> *</span><span class="identifier">al</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">negate_me</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">downs</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;ACL_parity</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">negate_me</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">negate_me</span><span class="plain">) { </span><span class="functiontext">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">not_interp</span><span class="plain">); </span><span class="functiontext">Emit::down</span><span class="plain">(); </span><span class="identifier">downs</span><span class="plain">++; }</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cl</span><span class="plain"> = 0;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">activity_list</span><span class="plain"> *</span><span class="identifier">k</span><span class="plain"> = </span><span class="identifier">al</span><span class="plain">; </span><span class="identifier">k</span><span class="plain">; </span><span class="identifier">k</span><span class="plain"> = </span><span class="identifier">k</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">) </span><span class="identifier">cl</span><span class="plain">++;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ncl</span><span class="plain"> = 0;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">al</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (++</span><span class="identifier">ncl</span><span class="plain"> &lt; </span><span class="identifier">cl</span><span class="plain">) { </span><span class="functiontext">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">or_interp</span><span class="plain">); </span><span class="functiontext">Emit::down</span><span class="plain">(); </span><span class="identifier">downs</span><span class="plain">++; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;activity</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="functiontext">Emit::inv_call</span><span class="plain">(</span><span class="functiontext">InterNames::to_symbol</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">TESTACTIVITY_HL</span><span class="plain">)));</span>
<span class="functiontext">Emit::down</span><span class="plain">();</span>
<span class="functiontext">Emit::val_iname</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;activity</span><span class="plain">-</span><span class="element">&gt;av_iname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;acting_on</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Specifications::is_description</span><span class="plain">(</span><span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;acting_on</span><span class="plain">)) {</span>
<span class="functiontext">Emit::val_iname</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Calculus::Deferrals::compile_deferred_description_test</span><span class="plain">(</span><span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;acting_on</span><span class="plain">));</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Emit::val</span><span class="plain">(</span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
<span class="functiontext">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;acting_on</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">Emit::up</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;only_when</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">al</span><span class="plain"> = </span><span class="identifier">al</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">downs</span><span class="plain"> &gt; 0) { </span><span class="functiontext">Emit::up</span><span class="plain">(); </span><span class="identifier">downs</span><span class="plain">--; }</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::compile_activity_constants</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::Activity_before_rulebooks_array</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">ACTIVITY_BEFORE_RULEBOOKS_HL</span><span class="plain">);</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Packaging::enter_home_of</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = 0;</span>
<span class="functiontext">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_number</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain">) {</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">((</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;before_rules</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">==0) </span><span class="functiontext">Emit::array_null_entry</span><span class="plain">();</span>
<span class="functiontext">Emit::array_null_entry</span><span class="plain">();</span>
<span class="functiontext">Emit::array_end</span><span class="plain">();</span>
<span class="functiontext">Packaging::exit</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::Activity_for_rulebooks_array</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">ACTIVITY_FOR_RULEBOOKS_HL</span><span class="plain">);</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Packaging::enter_home_of</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = 0;</span>
<span class="functiontext">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_number</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain">) {</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">((</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;for_rules</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">==0) </span><span class="functiontext">Emit::array_null_entry</span><span class="plain">();</span>
<span class="functiontext">Emit::array_null_entry</span><span class="plain">();</span>
<span class="functiontext">Emit::array_end</span><span class="plain">();</span>
<span class="functiontext">Packaging::exit</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::Activity_after_rulebooks_array</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">ACTIVITY_AFTER_RULEBOOKS_HL</span><span class="plain">);</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Packaging::enter_home_of</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = 0;</span>
<span class="functiontext">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_number</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain">) {</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">((</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;after_rules</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">==0) </span><span class="functiontext">Emit::array_null_entry</span><span class="plain">();</span>
<span class="functiontext">Emit::array_null_entry</span><span class="plain">();</span>
<span class="functiontext">Emit::array_end</span><span class="plain">();</span>
<span class="functiontext">Packaging::exit</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::Activity_atb_rulebooks_array</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">ACTIVITY_ATB_RULEBOOKS_HL</span><span class="plain">);</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Packaging::enter_home_of</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = 0;</span>
<span class="functiontext">Emit::named_byte_array_begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_number</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain">) {</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">((</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="functiontext">Rulebooks::used_by_future_actions</span><span class="plain">(</span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;before_rules</span><span class="plain">));</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">==0) </span><span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(255);</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(255);</span>
<span class="functiontext">Emit::array_end</span><span class="plain">();</span>
<span class="functiontext">Packaging::exit</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::annotate_list_for_cross_references</span><span class="plain">(</span><span class="reserved">activity_list</span><span class="plain"> *</span><span class="identifier">avl</span><span class="plain">, </span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">avl</span><span class="plain">; </span><span class="identifier">avl</span><span class="plain"> = </span><span class="identifier">avl</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">avl</span><span class="plain">-</span><span class="element">&gt;activity</span><span class="plain">) {</span>
<span class="reserved">activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain"> = </span><span class="identifier">avl</span><span class="plain">-</span><span class="element">&gt;activity</span><span class="plain">;</span>
<span class="reserved">activity_crossref</span><span class="plain"> *</span><span class="identifier">acr</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">activity_crossref</span><span class="plain">);</span>
<span class="identifier">acr</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;cross_references</span><span class="plain">;</span>
<span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;cross_references</span><span class="plain"> = </span><span class="identifier">acr</span><span class="plain">;</span>
<span class="identifier">acr</span><span class="plain">-</span><span class="element">&gt;rule_dependent</span><span class="plain"> = </span><span class="identifier">ph</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Activities::index_cross_references</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">,</span><span class="reserved"> activity</span><span class="plain"> *</span><span class="identifier">av</span><span class="plain">) {</span>
<span class="reserved">activity_crossref</span><span class="plain"> *</span><span class="identifier">acr</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">acr</span><span class="plain"> = </span><span class="identifier">av</span><span class="plain">-</span><span class="element">&gt;cross_references</span><span class="plain">; </span><span class="identifier">acr</span><span class="plain">; </span><span class="identifier">acr</span><span class="plain"> = </span><span class="identifier">acr</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">) {</span>
<span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain"> = </span><span class="identifier">acr</span><span class="plain">-</span><span class="element">&gt;rule_dependent</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;declaration_node</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;declaration_node</span><span class="plain">)))) {</span>
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 2, </span><span class="string">"tight"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"NB: %W"</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;declaration_node</span><span class="plain">));</span>
<span class="identifier">Index::link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;declaration_node</span><span class="plain">)));</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Activities::parse_list_inner is used in <a href="#SP12">&#167;12</a>.</p>
<p class="endnote">The function Activities::emit_activity_list is used in 22/prcd (<a href="22-prcd.html#SP10_5">&#167;10.5</a>).</p>
<p class="endnote">The function Activities::compile_activity_constants is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Activities::Activity_before_rulebooks_array is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Activities::Activity_for_rulebooks_array is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Activities::Activity_after_rulebooks_array is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Activities::Activity_atb_rulebooks_array is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function Activities::annotate_list_for_cross_references is used in 22/prcd (<a href="22-prcd.html#SP10_5">&#167;10.5</a>).</p>
<p class="endnote">The function Activities::index_cross_references is used in <a href="#SP9">&#167;9</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="21-sv.html">Back to 'Stacked Variables'</a></li><li><i>(This section ends Chapter 21: Rules and Rulebooks.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>