1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 08:34:22 +03:00
inform7/docs/if-module/4-act.html
2019-09-01 11:50:12 +01:00

1943 lines
280 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>3/ts</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 '4/act' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">if</a></li><li><a href="index.html#4">Chapter 4: Actions</a></li><li><b>Actions</b></li></ul><p class="purpose">To define, map to I6 and index individual actions.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP23">&#167;23. Action variables</a></li><li><a href="#SP33">&#167;33. Past tense</a></li><li><a href="#SP34">&#167;34. The grammar list</a></li><li><a href="#SP35">&#167;35. Typechecking grammar for an action</a></li><li><a href="#SP36">&#167;36. Compiling data about actions</a></li><li><a href="#SP37">&#167;37. Compiling data about actions</a></li><li><a href="#SP39">&#167;39. Indexing</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>An action is an impulse to do something within the model world, and which
may not be possible. Much of the work of designing an interactive fiction
consists in responding to the actions of the player, sometimes in ways
which the player expects, sometimes not. Design systems for interactive
fiction therefore need to provide flexible and convenient ways to discuss
actions.
</p>
<p class="inwebparagraph">An activity is by contrast something done by the run-time code during play:
for instance, printing the name of an object, or asking a disambiguation
question. These tasks must similarly be customisable by the designer, and
a system of rulebooks is used which parallels the treatment of actions.
</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Some fields of this structure reflect the history of NI, and of I6 for
that matter: in particular, very few actions if any now use an I6-library
defined verb routine, but the ability is kept against future need; and
the idea of a flexible number of parameters &mdash; which I6 allowed, thus
parsing "listen" and "listen to the frog" as the same action, with
0 and 1 parameters respectively &mdash; has been dropped in I7. (We use the
activities for selecting missing parameters instead.) So for now the minimum
and maximum below are always equal.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">action_name</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">noun</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">; </span> <span class="comment">such as "taking action"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">present_name</span><span class="plain">; </span> <span class="comment">such as "drop" or "take"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">past_name</span><span class="plain">; </span> <span class="comment">such as "dropped" or "taken"</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">it_optional</span><span class="plain">; </span> <span class="comment">noun optional when describing the second noun?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">abbreviable</span><span class="plain">; </span> <span class="comment">preposition optional when describing the second noun?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">translated</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">translated_name</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">an_base_iname</span><span class="plain">; </span> <span class="comment">e.g., <code class="display"><span class="extract">Take</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">an_iname</span><span class="plain">; </span> <span class="comment">e.g., <code class="display"><span class="extract">##Take</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">an_routine_iname</span><span class="plain">; </span> <span class="comment">e.g., <code class="display"><span class="extract">TakeSub</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">an_package</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">out_of_world</span><span class="plain">; </span> <span class="comment">action is declared as out of world?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">use_verb_routine_in_I6_library</span><span class="plain">; </span> <span class="comment">rather than compiling our own?</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">rulebook</span><span class="plain"> *</span><span class="identifier">check_rules</span><span class="plain">; </span> <span class="comment">rulebooks private to this action</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">rulebook</span><span class="plain"> *</span><span class="identifier">carry_out_rules</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">rulebook</span><span class="plain"> *</span><span class="identifier">report_rules</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">stacked_variable_owner</span><span class="plain"> *</span><span class="identifier">owned_by_an</span><span class="plain">; </span> <span class="comment">action variables owned here</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">designers_specification</span><span class="plain">; </span> <span class="comment">where created</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">requires_light</span><span class="plain">; </span> <span class="comment">does this action require light to be carried out?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">min_parameters</span><span class="plain">, </span><span class="identifier">max_parameters</span><span class="plain">; </span> <span class="comment">in the range 0 to 2</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">noun_access</span><span class="plain">; </span> <span class="comment">one of the possibilities below</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">second_access</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">noun_kind</span><span class="plain">; </span> <span class="comment">if there is at least 1 parameter</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">second_kind</span><span class="plain">; </span> <span class="comment">if there are 2 parameters</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">grammar_line</span><span class="plain"> *</span><span class="identifier">list_with_action</span><span class="plain">; </span> <span class="comment">list of grammar producing this</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">an_specification_text_word</span><span class="plain">; </span> <span class="comment">description used in index</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">an_index_group</span><span class="plain">; </span> <span class="comment">paragraph number it belongs to (1, 2, 3, ...)</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">action_name</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure action_name is accessed in 2/bd, 3/tnt, 3/sm, 3/tp, 3/bck, 3/rgn, 3/tm, 3/em, 3/sc, 3/scn, 4/anl, 4/nap, 4/ai, 5/gp, 5/gv, 5/gl, 5/gpr and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
<span class="identifier">stacked_variable_owner_list</span><span class="plain"> *</span><span class="identifier">all_nonempty_stacked_action_vars</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>One action has special rules, to accommodate the "nowhere" syntax:
</p>
<pre class="display">
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">going_action</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">waiting_action</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>The access possibilities for the noun and second noun are as follows.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">UNRESTRICTED_ACCESS</span><span class="plain"> 0 </span> <span class="comment">question not meaningful, e.g. for a number</span>
<span class="definitionkeyword">define</span> <span class="constant">IMPOSSIBLE_ACCESS</span><span class="plain"> 1 </span> <span class="comment">action doesn't take a noun, so no question of access</span>
<span class="definitionkeyword">define</span> <span class="constant">DOESNT_REQUIRE_ACCESS</span><span class="plain"> 2 </span> <span class="comment">actor need not be able to touch this object</span>
<span class="definitionkeyword">define</span> <span class="constant">REQUIRES_ACCESS</span><span class="plain"> 3 </span> <span class="comment">actor must be able to touch this object</span>
<span class="definitionkeyword">define</span> <span class="constant">REQUIRES_POSSESSION</span><span class="plain"> 4 </span> <span class="comment">actor must be carrying this object</span>
</pre>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b><code class="display"><span class="extract">DESCRIPTION_OF_ACTION</span></code> is used in type-checking to represent gerunds: that
is, actions described by what appear to be participles but which are in
context nouns ("if taking something, ...").
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">ACTION_NAME</span></code>. For those rare occasions where we need to identify the
basic underlying action but none of the nouns, etc., thereto. At run-time,
this stores as the I6 action number: e.g. <code class="display"><span class="extract">##Go</span></code> for the going action.
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">STORED_ACTION</span></code> is just what it says it is: a stored action, which can be
tried later. This is a pointer value; see "StoredAction.i6t".
</p>
<pre class="display">
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K_description_of_action</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></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">PL::Actions::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NEW_BASE_KIND_NOTIFY</span><span class="plain">, </span><span class="functiontext">PL::Actions::actions_new_base_kind_notify</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_COMPILE_CONSTANT</span><span class="plain">, </span><span class="functiontext">PL::Actions::actions_compile_constant</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_OFFERED_PROPERTY</span><span class="plain">, </span><span class="functiontext">PL::Actions::actions_offered_property</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_OFFERED_SPECIFICATION</span><span class="plain">, </span><span class="functiontext">PL::Actions::actions_offered_specification</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_TYPECHECK_EQUALITY</span><span class="plain">, </span><span class="functiontext">PL::Actions::actions_typecheck_equality</span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_FORBID_SETTING</span><span class="plain">, </span><span class="functiontext">PL::Actions::actions_forbid_setting</span><span class="plain">);</span>
<span class="identifier">Vocabulary::set_flags</span><span class="plain">(</span><span class="identifier">Vocabulary::entry_for_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"doing"</span><span class="plain">), </span><span class="identifier">ACTION_PARTICIPLE_MC</span><span class="plain">);</span>
<span class="identifier">Vocabulary::set_flags</span><span class="plain">(</span><span class="identifier">Vocabulary::entry_for_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"asking"</span><span class="plain">), </span><span class="identifier">ACTION_PARTICIPLE_MC</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::start appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::actions_new_base_kind_notify</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">new_base</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</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">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"ACTION_NAME_TY"</span><span class="plain">)) {</span>
<span class="identifier">K_action_name</span><span class="plain"> = </span><span class="identifier">new_base</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">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"DESCRIPTION_OF_ACTION_TY"</span><span class="plain">)) {</span>
<span class="identifier">K_description_of_action</span><span class="plain"> = </span><span class="identifier">new_base</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">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"STORED_ACTION_TY"</span><span class="plain">)) {</span>
<span class="identifier">K_stored_action</span><span class="plain"> = </span><span class="identifier">new_base</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="endnote">The function PL::Actions::actions_new_base_kind_notify is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::actions_compile_constant</span><span class="plain">(</span><span class="identifier">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</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">Plugins::Manage::plugged_in</span><span class="plain">(</span><span class="identifier">actions_plugin</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"actions plugin inactive"</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">K</span><span class="plain">, </span><span class="identifier">K_action_name</span><span class="plain">)) {</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain"> = </span><span class="identifier">Rvalues::to_action_name</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">Holsters::data_acceptable</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">)) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">PL::Actions::iname</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain">) </span><span class="identifier">Emit::holster</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">);</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">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_description_of_action</span><span class="plain">)) {</span>
<span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = </span><span class="identifier">ParseTree::get_constant_action_pattern</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, *</span><span class="identifier">ap</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">TRUE</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="identifier">K</span><span class="plain">, </span><span class="identifier">K_stored_action</span><span class="plain">)) {</span>
<span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = </span><span class="identifier">ParseTree::get_constant_action_pattern</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">TEST_COMPILATION_MODE</span><span class="plain">(</span><span class="identifier">CONSTANT_CMODE</span><span class="plain">))</span>
<span class="functiontext">PL::Actions::Patterns::as_stored_action</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">PL::Actions::Patterns::emit_try</span><span class="plain">(</span><span class="identifier">ap</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">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>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::actions_offered_property</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">what</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">K</span><span class="plain">, </span><span class="identifier">K_action_name</span><span class="plain">)) {</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain"> = </span><span class="identifier">Rvalues::to_action_name</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"failed to extract action-name structure"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == 1) </span><span class="functiontext">PL::Actions::an_add_variable</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">what</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>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::actions_offered_specification</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">owner</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">if</span><span class="plain"> (</span><span class="identifier">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">, </span><span class="identifier">K_action_name</span><span class="plain">)) {</span>
<span class="functiontext">PL::Actions::actions_set_specification_text</span><span class="plain">(</span><span class="identifier">Rvalues::to_action_name</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">), </span><span class="identifier">Wordings::first_wn</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="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="endnote">The function PL::Actions::actions_compile_constant is used in <a href="#SP8">&#167;8</a>.</p>
<p class="endnote">The function PL::Actions::actions_offered_property is used in <a href="#SP8">&#167;8</a>.</p>
<p class="endnote">The function PL::Actions::actions_offered_specification is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>A stored action can always be compared to a gerund: for instance,
</p>
<blockquote>
<p>if the current action is taking something...</p>
</blockquote>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::actions_typecheck_equality</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K1</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K2</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">K1</span><span class="plain">, </span><span class="identifier">K_stored_action</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">K2</span><span class="plain">, </span><span class="identifier">K_description_of_action</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="endnote">The function PL::Actions::actions_typecheck_equality is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>It could be argued that this ought to be a typechecking rule, but it applies
only to setting true, so is here instead. The distinction is there because we
can check whether an action is "taking a container" (say) but can't set a
stored action equal to it, because it's too vague: what is the container to be
taken?
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::actions_forbid_setting</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</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 PL::Actions::actions_forbid_setting is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>The constructor function for action names divides them into two according
to their implementation. Some actions are fully implemented in I6, and do
not have the standard check/carry out/report rulebooks: others are full I7
actions. (As I7 has matured, more and more actions have moved from the
first category to the second.)
</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>This is an action name which Inform provides special support for; it
recognises the English name when defined by the Standard Rules. (So there is no
need to translate this to other languages.)
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">actions</span><span class="plain">&gt; ::=</span>
<span class="identifier">waiting</span><span class="plain"> |</span>
<span class="identifier">going</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>When we want to refer to an action name as a noun, we can use this to
make that explicit: for instance, "taking" becomes "the taking action".
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">action</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"> action</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b></p>
<pre class="display">
<span class="reserved">action_name</span><span class="plain"> *</span><span class="functiontext">PL::Actions::act_new</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">implemented_by_I7</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">make_ds</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">actions</span><span class="plain">&gt;(</span><span class="identifier">W</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; == 1) &amp;&amp; (</span><span class="identifier">going_action</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">going_action</span><span class="plain"> = </span><span class="identifier">an</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; == 0) &amp;&amp; (</span><span class="identifier">waiting_action</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
<span class="identifier">waiting_action</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">;</span>
<span class="identifier">make_ds</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;past_name</span><span class="plain"> = </span><span class="identifier">PastParticiples::pasturise_wording</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">);</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;it_optional</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;abbreviable</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;translated</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;translated_name</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_package</span><span class="plain"> = </span><span class="identifier">Hierarchy::local_package</span><span class="plain">(</span><span class="identifier">ACTIONS_HAP</span><span class="plain">);</span>
<span class="identifier">Hierarchy::markup_wording</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_package</span><span class="plain">, </span><span class="identifier">ACTION_NAME_HMD</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_base_iname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;use_verb_routine_in_I6_library</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;check_rules</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;carry_out_rules</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;report_rules</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;requires_light</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_access</span><span class="plain"> = </span><span class="constant">IMPOSSIBLE_ACCESS</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_access</span><span class="plain"> = </span><span class="constant">IMPOSSIBLE_ACCESS</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;min_parameters</span><span class="plain"> = 0;</span>
<span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">max_parameters</span><span class="plain"> = 0;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_kind</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_kind</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;designers_specification</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;list_with_action</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;out_of_world</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_specification_text_word</span><span class="plain"> = -1;</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">(&lt;</span><span class="identifier">action</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">W</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">an</span><span class="plain">-</span><span class="element">&gt;name</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="identifier">MISCELLANEOUS_MC</span><span class="plain">, </span><span class="identifier">Rvalues::from_action_name</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">));</span>
<span class="identifier">Vocabulary::set_flags</span><span class="plain">(</span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)), </span><span class="identifier">ACTION_PARTICIPLE_MC</span><span class="plain">);</span>
<span class="identifier">Kinds::Behaviour::new_enumerated_value</span><span class="plain">(</span><span class="identifier">K_action_name</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 action: %W\</span><span class="plain">n</span><span class="string">"</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="identifier">implemented_by_I7</span><span class="plain">) {</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;use_verb_routine_in_I6_library</span><span class="plain"> = </span><span class="identifier">FALSE</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">"check"</span><span class="plain">);</span>
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</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="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">CR</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_package_in</span><span class="plain">(</span><span class="identifier">CHECK_RB_HL</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_package</span><span class="plain">);</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;check_rules</span><span class="plain"> =</span>
<span class="identifier">Rulebooks::new_automatic</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">K_action_name</span><span class="plain">,</span>
<span class="identifier">NO_OUTCOME</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">CR</span><span class="plain">);</span>
<span class="identifier">Rulebooks::fragment_by_actions</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;check_rules</span><span class="plain">, 1);</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">"carry out"</span><span class="plain">);</span>
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">);</span>
<span class="identifier">W</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="identifier">package_request</span><span class="plain"> *</span><span class="identifier">OR</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_package_in</span><span class="plain">(</span><span class="identifier">CARRY_OUT_RB_HL</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_package</span><span class="plain">);</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;carry_out_rules</span><span class="plain"> =</span>
<span class="identifier">Rulebooks::new_automatic</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">K_action_name</span><span class="plain">,</span>
<span class="identifier">NO_OUTCOME</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">OR</span><span class="plain">);</span>
<span class="identifier">Rulebooks::fragment_by_actions</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;carry_out_rules</span><span class="plain">, 2);</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">"report"</span><span class="plain">);</span>
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">);</span>
<span class="identifier">W</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="identifier">package_request</span><span class="plain"> *</span><span class="identifier">RR</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_package_in</span><span class="plain">(</span><span class="identifier">REPORT_RB_HL</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_package</span><span class="plain">);</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;report_rules</span><span class="plain"> =</span>
<span class="identifier">Rulebooks::new_automatic</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">K_action_name</span><span class="plain">,</span>
<span class="identifier">NO_OUTCOME</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">RR</span><span class="plain">);</span>
<span class="identifier">Rulebooks::fragment_by_actions</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;report_rules</span><span class="plain">, 1);</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain"> = </span><span class="identifier">StackedVariables::new_owner</span><span class="plain">(20000+</span><span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an2</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an2</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain"> != </span><span class="identifier">an2</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Actions::action_names_overlap</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">an2</span><span class="plain">)) {</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;it_optional</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">an2</span><span class="plain">-</span><span class="element">&gt;it_optional</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="comment">pointing at, pointing it at</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::act_new is used in <a href="#SP28">&#167;28</a>.</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>The "action pronoun" use of "it" is to be a placeholder in an action
name to indicate where a noun phrase should appear. Some actions apply to
only one noun: for instance, in
</p>
<blockquote>
<p>taking the box</p>
</blockquote>
<p class="inwebparagraph">the action name is "taking". Others apply to two nouns:
</p>
<blockquote>
<p>unlocking the blue door with the key</p>
</blockquote>
<p class="inwebparagraph">has action name "unlocking it with". Inform always places one noun phrase
after the action name, but if it sees &lt;action-pronoun&gt; in the action name
then it places a second noun phrase at that point. (Any accusative pronoun
will do: it doesn't have to be "it".)
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">accusative</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">&gt;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::action_names_overlap</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an1</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an2</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="identifier">an1</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">XW</span><span class="plain"> = </span><span class="identifier">an2</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">), </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">);</span>
<span class="plain">(</span><span class="identifier">i</span><span class="plain"> &lt;= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">j</span><span class="plain"> &lt;= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">));</span>
<span class="identifier">i</span><span class="plain">++, </span><span class="identifier">j</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> ((&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">&gt;(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">))) &amp;&amp; (</span><span class="identifier">compare_words</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">+1, </span><span class="identifier">j</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">if</span><span class="plain"> ((&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">&gt;(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">))) &amp;&amp; (</span><span class="identifier">compare_words</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">+1, </span><span class="identifier">i</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">if</span><span class="plain"> (</span><span class="identifier">compare_words</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">j</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="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::log</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"&lt;null-action-name&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::action_names_overlap is used in <a href="#SP16">&#167;16</a>.</p>
<p class="endnote">The function PL::Actions::log is used in 1/im (<a href="1-im.html#SP4">&#167;4</a>, <a href="1-im.html#SP4_4">&#167;4.4</a>).</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>And the following matches an action name (with no substitution of noun
phrases: "unlocking the door with" won't match the unlocking action; only
"unlocking it with" will do that).
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">action</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="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">)) {</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">an</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="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">optional</span><span class="plain">-</span><span class="identifier">trailing</span><span class="plain">-</span><span class="identifier">prepositions</span><span class="plain">&gt;(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">)) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">SHW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">optional</span><span class="plain">-</span><span class="identifier">trailing</span><span class="plain">-</span><span class="identifier">prepositions</span><span class="plain">&gt;, 1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">SHW</span><span class="plain">)) {</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">an</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="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="SP20"></a><b>&#167;20. </b>However, &lt;action-name&gt; can also be made to match an action name without
a final preposition, if that preposition is on the following list. For
example, it allows "listening" to match the listening to action; this is
needed because of the almost unique status of "listening" in having an
optional noun. (Unabbreviated action names always win if there's an
ambiguity here: i.e., if there is a second action called just "listening",
then that's what "listening" will match.)
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">optional</span><span class="plain">-</span><span class="identifier">trailing</span><span class="plain">-</span><span class="identifier">prepositions</span><span class="plain">&gt; ::=</span>
<span class="plain">... </span><span class="identifier">to</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b></p>
<pre class="display">
<span class="reserved">action_name</span><span class="plain"> *</span><span class="functiontext">PL::Actions::longest_null</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">tense</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">excess</span><span class="plain">) {</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">max_parameters</span><span class="plain"> == 0) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = (</span><span class="identifier">tense</span><span class="plain"> == </span><span class="identifier">IS_TENSE</span><span class="plain">) ? (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">) : (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;past_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::starts_with</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">AW</span><span class="plain">)) {</span>
<span class="plain">*</span><span class="identifier">excess</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) + </span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</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">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::it_optional</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;it_optional</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::abbreviable</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;abbreviable</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">PL::Actions::identifier</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Emit::to_text</span><span class="plain">(</span><span class="functiontext">PL::Actions::base_iname</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Wait</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">waiting_action</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"wait action not ready"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">waiting_action</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">PL::Actions::base_iname</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_base_iname</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">waiting_action</span><span class="plain"> == </span><span class="identifier">an</span><span class="plain">)</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_base_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">WAIT_HL</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_package</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">Str::len</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;translated_name</span><span class="plain">) &gt; 0)</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_base_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_with_specific_name</span><span class="plain">(</span><span class="identifier">TRANSLATED_BASE_NAME_HL</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;translated_name</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_package</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_base_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_with_memo</span><span class="plain">(</span><span class="identifier">ACTION_BASE_NAME_HL</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_package</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_base_iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">PL::Actions::double_sharp</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_iname</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::derive_iname_in</span><span class="plain">(</span><span class="identifier">DOUBLE_SHARP_NAME_HL</span><span class="plain">, </span><span class="functiontext">PL::Actions::base_iname</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">), </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_package</span><span class="plain">);</span>
<span class="identifier">Emit::ds_named_pseudo_numeric_constant</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_iname</span><span class="plain">);</span>
<span class="identifier">Produce::annotate_i</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_iname</span><span class="plain">, </span><span class="identifier">ACTION_IANN</span><span class="plain">, 1);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Sub</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_routine_iname</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_routine_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::derive_iname_in</span><span class="plain">(</span><span class="identifier">PERFORM_FN_HL</span><span class="plain">, </span><span class="functiontext">PL::Actions::base_iname</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">), </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_package</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_routine_iname</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_routine_iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">PL::Actions::iname</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">PL::Actions::double_sharp</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">rulebook</span><span class="plain"> *</span><span class="functiontext">PL::Actions::get_fragmented_rulebook</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="identifier">CHECK_RB</span><span class="plain">]) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;check_rules</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="identifier">CARRY_OUT_RB</span><span class="plain">]) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;carry_out_rules</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rb</span><span class="plain"> == </span><span class="identifier">built_in_rulebooks</span><span class="plain">[</span><span class="identifier">REPORT_RB</span><span class="plain">]) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;report_rules</span><span class="plain">;</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"asked for peculiar fragmented rulebook"</span><span class="plain">); </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="identifier">rulebook</span><span class="plain"> *</span><span class="functiontext">PL::Actions::switch_fragmented_rulebook</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">new_an</span><span class="plain">, </span><span class="identifier">rulebook</span><span class="plain"> *</span><span class="identifier">orig</span><span class="plain">) {</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">new_an</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">orig</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">orig</span><span class="plain"> == </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;check_rules</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">new_an</span><span class="plain">-</span><span class="element">&gt;check_rules</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">orig</span><span class="plain"> == </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;carry_out_rules</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">new_an</span><span class="plain">-</span><span class="element">&gt;carry_out_rules</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">orig</span><span class="plain"> == </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;report_rules</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">new_an</span><span class="plain">-</span><span class="element">&gt;report_rules</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">orig</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::actions_set_specification_text</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">wn</span><span class="plain">) {</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_specification_text_word</span><span class="plain"> = </span><span class="identifier">wn</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::an_get_specification_text</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_specification_text_word</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::longest_null is used in 4/ap (<a href="4-ap.html#SP26_3">&#167;26.3</a>).</p>
<p class="endnote">The function PL::Actions::it_optional is used in 4/anl (<a href="4-anl.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function PL::Actions::abbreviable is used in 4/anl (<a href="4-anl.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function PL::Actions::identifier is used in <a href="#SP38">&#167;38</a>, <a href="#SP39">&#167;39</a>.</p>
<p class="endnote">The function PL::Actions::Wait appears nowhere else.</p>
<p class="endnote">The function PL::Actions::base_iname is used in <a href="#SP22">&#167;22</a>.</p>
<p class="endnote">The function PL::Actions::double_sharp is used in <a href="#SP37">&#167;37</a>, 4/anl (<a href="4-anl.html#SP9">&#167;9</a>), 4/ap (<a href="4-ap.html#SP29">&#167;29</a>, <a href="4-ap.html#SP35">&#167;35</a>).</p>
<p class="endnote">The function PL::Actions::Sub is used in <a href="#SP36">&#167;36</a>.</p>
<p class="endnote">The function PL::Actions::iname is used in <a href="#SP10">&#167;10</a>.</p>
<p class="endnote">The function PL::Actions::get_fragmented_rulebook appears nowhere else.</p>
<p class="endnote">The function PL::Actions::switch_fragmented_rulebook appears nowhere else.</p>
<p class="endnote">The function PL::Actions::actions_set_specification_text is used in <a href="#SP10">&#167;10</a>.</p>
<p class="endnote">The function PL::Actions::an_get_specification_text is used in <a href="#SP39">&#167;39</a>.</p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b>Most actions are given automatically generated Inform 6 names in the
compiled code: <code class="display"><span class="extract">Q4_green</span></code>, for instance. A few must however correspond to
names of significance in the I6 library.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::name_all</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">PL::Actions::translates</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="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p2</span><span class="plain">) {</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</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">action</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">an</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">LOG</span><span class="plain">(</span><span class="string">"Tried action name %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">W</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_TranslatesNonAction</span><span class="plain">),</span>
<span class="string">"this does not appear to be the name of an action"</span><span class="plain">,</span>
<span class="string">"so cannot be translated into I6 at all."</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">an</span><span class="plain">-</span><span class="element">&gt;translated</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Tried action name %W = %n\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="functiontext">PL::Actions::base_iname</span><span class="plain">(</span><span class="identifier">an</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_TranslatesActionAlready</span><span class="plain">),</span>
<span class="string">"this action has already been translated"</span><span class="plain">,</span>
<span class="string">"so there must be some duplication somewhere."</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">an</span><span class="plain">-</span><span class="element">&gt;an_base_iname</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"too late for action base name translation"</span><span class="plain">);</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;translated</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;translated_name</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;translated_name</span><span class="plain">, </span><span class="string">"%N"</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">p2</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">"Translated action: $l as %n\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="functiontext">PL::Actions::base_iname</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::get_stem_length</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> 0; </span> <span class="comment">should never happen</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (!(&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">&gt;(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">))))</span>
<span class="identifier">s</span><span class="plain">++;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">s</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::name_all appears nowhere else.</p>
<p class="endnote">The function PL::Actions::translates appears nowhere else.</p>
<p class="endnote">The function PL::Actions::get_stem_length is used in 4/anl (<a href="4-anl.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. Action variables. </b>Action variables can optionally be marked as able to extend the grammar of
action patterns. For example, the Standard Rules define:
</p>
<blockquote>
<p>The exiting action has an object called the container exited from (matched as "from").</p>
</blockquote>
<p class="inwebparagraph">and this allows "exiting from the cage", say, as an action pattern.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">action</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">matched</span><span class="plain"> </span><span class="identifier">as</span><span class="plain"> {&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} ) | ==&gt; </span><span class="identifier">TRUE</span>
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ( ... ) | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_BadMatchingSyntax problem</span> <span class="cwebmacronumber">23.2</span>&gt;
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ==&gt; </span><span class="identifier">FALSE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP23_1"></a><b>&#167;23.1. </b>And the new action variable name is vetted by being run through this:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">action</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_ActionVarAnd problem</span> <span class="cwebmacronumber">23.1.1</span>&gt;
<span class="plain">... ==&gt; </span><span class="identifier">TRUE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP23_2"></a><b>&#167;23.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_BadMatchingSyntax problem</span> <span class="cwebmacronumber">23.2</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_BadMatchingSyntax</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 action - a value associated "</span>
<span class="string">"with a action and which has a name. The request seems to "</span>
<span class="string">"say in parentheses that the name in question is '%2', but "</span>
<span class="string">"I only recognise the form '(matched as \</span><span class="plain">"</span><span class="string">some text\</span><span class="plain">"</span><span class="string">)' here."</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="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_1_1"></a><b>&#167;23.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_ActionVarAnd problem</span> <span class="cwebmacronumber">23.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<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_ActionVarAnd</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 action - a value associated "</span>
<span class="string">"with a action 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="#SP23_1">&#167;23.1</a>.</p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::an_add_variable</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</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">wording</span><span class="plain"> </span><span class="identifier">MW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">stacked_variable</span><span class="plain"> *</span><span class="identifier">stv</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">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">) != </span><span class="identifier">PROPERTYCALLED_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_ActionVarUncalled</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 action - a value associated "</span>
<span class="string">"with a action and which has a name. But since you only give "</span>
<span class="string">"a kind, not a name, I'm stuck. ('The taking action has a "</span>
<span class="string">"number called tenacity' is right, 'The taking action has a "</span>
<span class="string">"number' is too vague.)"</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">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain"> == </span><span class="identifier">NULL</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">-&gt;</span><span class="identifier">down</span><span class="plain">-</span><span class="element">&gt;next</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">Untestable</span><span class="plain">)); </span> <span class="comment">since we no longer define such actions</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 action - a value associated "</span>
<span class="string">"with a action and which has a name. But this is a low-level "</span>
<span class="string">"action implemented internally by the Inform 6 library, and "</span>
<span class="string">"I am unable to give it any variables. Sorry."</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">NW</span><span class="plain"> = </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-&gt;</span><span class="identifier">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;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">variable</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">-&gt;</span><span class="identifier">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="identifier">NW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;, 1);</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">MW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">&gt;, 1);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">wn</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">MW</span><span class="plain">);</span>
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">);</span>
<span class="identifier">MW</span><span class="plain"> = </span><span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">MW</span><span class="plain">) &gt; 1) {</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">MW</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_MatchedAsTooLong</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 action - a value associated "</span>
<span class="string">"with a action and which has a name. You say that it should "</span>
<span class="string">"be '(matched as \</span><span class="plain">"</span><span class="string">%2\</span><span class="plain">"</span><span class="string">)', but I can only recognise such "</span>
<span class="string">"matches when a single keyword is used to introduce the "</span>
<span class="string">"clause, and this is more than one word."</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="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</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">k</span><span class="plain">-</span><span class="identifier">kind</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">-&gt;</span><span class="identifier">down</span><span class="plain">))) </span><span class="identifier">K</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">parse_node</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">-&gt;</span><span class="identifier">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="identifier">Specifications::is_description</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">-&gt;</span><span class="identifier">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_ActionVarOverspecific</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 action - a value associated "</span>
<span class="string">"with a action 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="plain">} </span><span class="reserved">else</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">-&gt;</span><span class="identifier">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_ActionVarUnknownKOV</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="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="identifier">K</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">-&gt;</span><span class="identifier">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_ActionVarValue</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="reserved">if</span><span class="plain"> (</span><span class="identifier">StackedVariables::owner_empty</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">)) {</span>
<span class="identifier">all_nonempty_stacked_action_vars</span><span class="plain"> =</span>
<span class="identifier">StackedVariables::add_owner_to_list</span><span class="plain">(</span><span class="identifier">all_nonempty_stacked_action_vars</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">stv</span><span class="plain"> = </span><span class="identifier">StackedVariables::add_empty</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">, </span><span class="identifier">NW</span><span class="plain">, </span><span class="identifier">K</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 action variable for $l: %W ($u)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">an</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-&gt;</span><span class="identifier">down</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">), </span><span class="identifier">K</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">MW</span><span class="plain">)) {</span>
<span class="identifier">StackedVariables::set_matching_text</span><span class="plain">(</span><span class="identifier">stv</span><span class="plain">, </span><span class="identifier">MW</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">"Match with text: %W + SP\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">MW</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">stacked_variable</span><span class="plain"> *</span><span class="functiontext">PL::Actions::parse_match_clause</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</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="identifier">StackedVariables::parse_match_clause</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::compile_action_name_var_creators</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">StackedVariables::owner_empty</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">ACTION_STV_CREATOR_FN_HL</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;an_package</span><span class="plain">);</span>
<span class="identifier">StackedVariables::compile_frame_creator</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">, </span><span class="identifier">iname</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 PL::Actions::an_add_variable is used in <a href="#SP10">&#167;10</a>.</p>
<p class="endnote">The function PL::Actions::parse_match_clause is used in 4/ap (<a href="4-ap.html#SP26_3">&#167;26.3</a>).</p>
<p class="endnote">The function PL::Actions::compile_action_name_var_creators is used in <a href="#SP37">&#167;37</a>.</p>
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b>This handles the special meaning "X is an action...".
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">action</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">indefinite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">&gt; &lt;</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[2]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]</span>
<span class="plain">&lt;</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; ::=</span>
<span class="identifier">action</span><span class="plain"> &lt;</span><span class="identifier">nounphrase</span><span class="plain">-</span><span class="identifier">actionable</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>
<span class="identifier">action</span><span class="plain"> ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_BadActionDeclaration problem</span> <span class="cwebmacronumber">25.1</span>&gt;
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP25_1"></a><b>&#167;25.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_BadActionDeclaration problem</span> <span class="cwebmacronumber">25.1</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">XP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::assertion_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadActionDeclaration</span><span class="plain">),</span>
<span class="string">"it is not sufficient to say that something is an 'action'"</span><span class="plain">,</span>
<span class="string">"without giving the necessary details: for example, 'Unclamping "</span>
<span class="string">"is an action applying to one thing.'"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP25">&#167;25</a>.</p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::new_action_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">"Taking something is an action."</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">new</span><span class="plain">-</span><span class="identifier">action</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="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; == </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="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">verb_id_ANNOT</span><span class="plain">, </span><span class="identifier">SPECIAL_MEANING_VB</span><span class="plain">);</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">O</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">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="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"> = </span><span class="identifier">O</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">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TRAVERSE1_SMFT</span><span class="plain">:</span>
<span class="functiontext">PL::Actions::act_parse_definition</span><span class="plain">(</span><span class="identifier">V</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 PL::Actions::new_action_SMF appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">OOW_ACT_CLAUSE</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">PP_ACT_CLAUSE</span><span class="plain"> 2</span>
<span class="definitionkeyword">define</span> <span class="constant">APPLYING_ACT_CLAUSE</span><span class="plain"> 3</span>
<span class="definitionkeyword">define</span> <span class="constant">LIGHT_ACT_CLAUSE</span><span class="plain"> 4</span>
<span class="definitionkeyword">define</span> <span class="constant">ABBREV_ACT_CLAUSE</span><span class="plain"> 5</span>
</pre>
<pre class="display">
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an_being_parsed</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. </b>We now come to a quite difficult sentence to parse: the declaration of a
new action.
</p>
<blockquote>
<p>Inserting it into is an action applying to two things.</p>
</blockquote>
<blockquote>
<p>Verifying the story file is an action out of world and applying to nothing.</p>
</blockquote>
<p class="inwebparagraph">The subject noun phrase needs little further parsing &mdash; it's the name of the
action to be created.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">action</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="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_ActionAlreadyExists problem</span> <span class="cwebmacronumber">28.1</span>&gt;
<span class="plain">... ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">PL::Actions::act_new</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP28_1"></a><b>&#167;28.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_ActionAlreadyExists problem</span> <span class="cwebmacronumber">28.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</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_ActionAlreadyExists</span><span class="plain">),</span>
<span class="string">"that seems to be an action already existing"</span><span class="plain">,</span>
<span class="string">"so it cannot be redefined now. If you would like to reconfigure "</span>
<span class="string">"an action in the standard set - for instance if you prefer "</span>
<span class="string">"'unlocking' to apply to only one thing, not two - create a new "</span>
<span class="string">"action for what you need ('keyless unlocking', perhaps) and then "</span>
<span class="string">"change the grammar to use the new action rather than the old "</span>
<span class="string">"('Understand \</span><span class="plain">"</span><span class="string">unlock [something]\</span><span class="plain">"</span><span class="string"> as keyless unlocking.')."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP28">&#167;28</a>.</p>
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. </b>The object NP is trickier, because it is a sequence
of "action clauses" which can occur in any order, which are allowed but
not required to be delimited as a list, and which can inconveniently
contain the word "and"; not only that, but note that in
</p>
<blockquote>
<p>applying to one thing and one number</p>
</blockquote>
<p class="inwebparagraph">the initial text "applying to one thing" would be valid as it stands.
It's convenient to define a single action clause first:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">&gt; ::=</span>
<span class="identifier">out</span><span class="plain"> </span><span class="identifier">of</span><span class="plain"> </span><span class="identifier">world</span><span class="plain"> | ==&gt; </span><span class="constant">OOW_ACT_CLAUSE</span>
<span class="identifier">abbreviable</span><span class="plain"> | ==&gt; </span><span class="constant">ABBREV_ACT_CLAUSE</span>
<span class="identifier">with</span><span class="plain"> </span><span class="identifier">past</span><span class="plain"> </span><span class="identifier">participle</span><span class="plain"> ... | ==&gt; </span><span class="constant">PP_ACT_CLAUSE</span>
<span class="identifier">applying</span><span class="plain"> </span><span class="identifier">to</span><span class="plain"> &lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">applications</span><span class="plain">&gt; | ==&gt; </span><span class="constant">APPLYING_ACT_CLAUSE</span><span class="plain">; &lt;&lt;</span><span class="identifier">num</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="identifier">requiring</span><span class="plain"> </span><span class="identifier">light</span><span class="plain"> ==&gt; </span><span class="constant">LIGHT_ACT_CLAUSE</span>
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">applications</span><span class="plain">&gt; ::=</span>
<span class="identifier">nothing</span><span class="plain"> | ==&gt; 0</span>
<span class="identifier">one</span><span class="plain"> &lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; </span><span class="identifier">and</span><span class="plain"> </span><span class="identifier">one</span><span class="plain"> &lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; | ==&gt; 2; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ac1</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[2]; &lt;&lt;</span><span class="identifier">ac2</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="identifier">one</span><span class="plain"> &lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; </span><span class="identifier">and</span><span class="plain"> &lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; | ==&gt; 2; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ac1</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[2]; &lt;&lt;</span><span class="identifier">ac2</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="plain">&lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; </span><span class="identifier">and</span><span class="plain"> </span><span class="identifier">one</span><span class="plain"> &lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; | ==&gt; 2; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ac1</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[2]; &lt;&lt;</span><span class="identifier">ac2</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="plain">&lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; </span><span class="identifier">and</span><span class="plain"> &lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; | ==&gt; 2; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ac1</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[2]; &lt;&lt;</span><span class="identifier">ac2</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="identifier">nothing</span><span class="plain"> </span><span class="identifier">or</span><span class="plain"> </span><span class="identifier">one</span><span class="plain"> &lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; | ==&gt; -1; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ac1</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="identifier">one</span><span class="plain"> &lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; | ==&gt; 1; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ac1</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="identifier">two</span><span class="plain"> &lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; | ==&gt; 2; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ac1</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ac2</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; | ==&gt; 1; &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">ac1</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_ActionMisapplied problem</span> <span class="cwebmacronumber">29.2</span>&gt;<span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">access</span><span class="plain">&gt; &lt;</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span>&lt;<span class="cwebmacro">Check action kind</span> <span class="cwebmacronumber">29.1</span>&gt;<span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">&gt; ==&gt; </span><span class="constant">UNRESTRICTED_ACCESS</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span>&lt;<span class="cwebmacro">Check action kind</span> <span class="cwebmacronumber">29.1</span>&gt;<span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">access</span><span class="plain">&gt; ::=</span>
<span class="identifier">visible</span><span class="plain"> | ==&gt; </span><span class="constant">DOESNT_REQUIRE_ACCESS</span>
<span class="identifier">touchable</span><span class="plain"> | ==&gt; </span><span class="constant">REQUIRES_ACCESS</span>
<span class="identifier">carried</span><span class="plain"> ==&gt; </span><span class="constant">REQUIRES_POSSESSION</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. </b>We are now able to define this peculiar form of list of action clauses:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">action</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">action</span><span class="plain">-</span><span class="identifier">clauses</span><span class="plain">&gt; | ==&gt; 0</span>
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_ActionClauseUnknown problem</span> <span class="cwebmacronumber">30.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clauses</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 on lookahead</span>
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clauses</span><span class="plain">&gt; &lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">-</span><span class="identifier">terminated</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[2]; </span>&lt;<span class="cwebmacro">Act on this action information</span> <span class="cwebmacronumber">30.2</span>&gt;
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">-</span><span class="identifier">terminated</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; </span>&lt;<span class="cwebmacro">Act on this action information</span> <span class="cwebmacronumber">30.2</span>&gt;
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">-</span><span class="identifier">terminated</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">&gt; , </span><span class="identifier">and</span><span class="plain"> | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">&gt; </span><span class="identifier">and</span><span class="plain"> | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">&gt; , | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP30_1"></a><b>&#167;30.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_ActionClauseUnknown problem</span> <span class="cwebmacronumber">30.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<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_ActionClauseUnknown</span><span class="plain">),</span>
<span class="string">"the action definition contained text I couldn't follow"</span><span class="plain">,</span>
<span class="string">"and may be too complicated."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP30">&#167;30</a>.</p>
<p class="inwebparagraph"><a id="SP30_2"></a><b>&#167;30.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Act on this action information</span> <span class="cwebmacronumber">30.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain"> (*</span><span class="identifier">X</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OOW_ACT_CLAUSE</span><span class="plain">:</span>
<span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;out_of_world</span><span class="plain"> = </span><span class="identifier">TRUE</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">PP_ACT_CLAUSE</span><span class="plain">: {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">&gt;, 1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">) != 1)</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_MultiwordPastParticiple</span><span class="plain">),</span>
<span class="string">"a past participle must be given as a single word"</span><span class="plain">,</span>
<span class="string">"even if the action name itself is longer than that. "</span>
<span class="string">"(For instance, the action name 'hanging around until' "</span>
<span class="string">"should have past participle given just as 'hung'; I "</span>
<span class="string">"can already deduce the rest.)"</span><span class="plain">);</span>
<span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;past_name</span><span class="plain"> =</span>
<span class="functiontext">PL::Actions::set_past_participle</span><span class="plain">(</span><span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;past_name</span><span class="plain">,</span>
<span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">));</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">APPLYING_ACT_CLAUSE</span><span class="plain">:</span>
<span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;noun_access</span><span class="plain"> = &lt;&lt;</span><span class="identifier">ac1</span><span class="plain">&gt;&gt;; </span><span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;second_access</span><span class="plain"> = &lt;&lt;</span><span class="identifier">ac2</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;noun_kind</span><span class="plain"> = &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">&gt;&gt;; </span><span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;second_kind</span><span class="plain"> = &lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;min_parameters</span><span class="plain"> = &lt;&lt;</span><span class="identifier">num</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">an_being_parsed</span><span class="plain">-&gt;</span><span class="identifier">max_parameters</span><span class="plain"> = </span><span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;min_parameters</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;min_parameters</span><span class="plain"> == -1) {</span>
<span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;min_parameters</span><span class="plain"> = 0;</span>
<span class="identifier">an_being_parsed</span><span class="plain">-&gt;</span><span class="identifier">max_parameters</span><span class="plain"> = 1;</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">LIGHT_ACT_CLAUSE</span><span class="plain">:</span>
<span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;requires_light</span><span class="plain"> = </span><span class="identifier">TRUE</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">ABBREV_ACT_CLAUSE</span><span class="plain">:</span>
<span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">&gt;abbreviable</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP30">&#167;30</a> (twice).</p>
<p class="inwebparagraph"><a id="SP29_1"></a><b>&#167;29.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Check action kind</span> <span class="cwebmacronumber">29.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(*</span><span class="identifier">XP</span><span class="plain">, </span><span class="identifier">K_thing</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (*</span><span class="identifier">X</span><span class="plain"> == </span><span class="constant">UNRESTRICTED_ACCESS</span><span class="plain">) *</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">REQUIRES_ACCESS</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">XP</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::lt</span><span class="plain">(*</span><span class="identifier">XP</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">Issue PM_ActionMisapplied problem</span> <span class="cwebmacronumber">29.2</span>&gt;<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">X</span><span class="plain"> != </span><span class="constant">UNRESTRICTED_ACCESS</span><span class="plain">) </span>&lt;<span class="cwebmacro">Issue PM_ActionMisapplied problem</span> <span class="cwebmacronumber">29.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP29">&#167;29</a> (twice).</p>
<p class="inwebparagraph"><a id="SP29_2"></a><b>&#167;29.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_ActionMisapplied problem</span> <span class="cwebmacronumber">29.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">REQUIRES_ACCESS</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">K_thing</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_ActionMisapplied</span><span class="plain">),</span>
<span class="string">"an action can only apply to things or to kinds of value"</span><span class="plain">,</span>
<span class="string">"for instance: 'photographing is an action applying to "</span>
<span class="string">"one visible thing'."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP29">&#167;29</a>, <a href="#SP29_1">&#167;29.1</a> (twice).</p>
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. </b></p>
<pre class="display">
<span class="identifier">wording</span><span class="plain"> </span><span class="functiontext">PL::Actions::set_past_participle</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">irregular_pp</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_wording</span><span class="plain">(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">irregular_pp</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) &gt; 1)</span>
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">Wordings::trim_first_word</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="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::set_past_participle is used in <a href="#SP30_2">&#167;30.2</a>.</p>
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::act_parse_definition</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="plain">&lt;</span><span class="identifier">action</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">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">));</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</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="identifier">an</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="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">) {</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;designers_specification</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">;</span>
<span class="identifier">an_being_parsed</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">;</span>
<span class="plain">&lt;&lt;</span><span class="identifier">ac1</span><span class="plain">&gt;&gt; = </span><span class="constant">IMPOSSIBLE_ACCESS</span><span class="plain">;</span>
<span class="plain">&lt;&lt;</span><span class="identifier">ac2</span><span class="plain">&gt;&gt; = </span><span class="constant">IMPOSSIBLE_ACCESS</span><span class="plain">;</span>
<span class="plain">&lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">&gt;&gt; = </span><span class="identifier">K_object</span><span class="plain">;</span>
<span class="plain">&lt;&lt;</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">&gt;&gt; = </span><span class="identifier">K_object</span><span class="plain">;</span>
<span class="plain">&lt;&lt;</span><span class="identifier">num</span><span class="plain">&gt;&gt; = 0;</span>
<span class="plain">&lt;</span><span class="identifier">action</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">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">max_parameters</span><span class="plain"> &gt;= 2) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_kind</span><span class="plain">, </span><span class="identifier">K_object</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::le</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_kind</span><span class="plain">, </span><span class="identifier">K_object</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_ActionBothValues</span><span class="plain">),</span>
<span class="string">"this action definition asks to have a single action apply "</span>
<span class="string">"to two different things which are not objects"</span><span class="plain">,</span>
<span class="string">"and unfortunately a fundamental restriction is that an "</span>
<span class="string">"action can apply to two objects, or one object and one "</span>
<span class="string">"value, but not to two values. Sorry about that."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::is_out_of_world</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;out_of_world</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>
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">PL::Actions::get_data_type_of_noun</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_kind</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">PL::Actions::get_data_type_of_second_noun</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_kind</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="functiontext">PL::Actions::set_text_to_name_tensed</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">tense</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tense</span><span class="plain"> == </span><span class="identifier">HASBEEN_TENSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;past_name</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::can_have_parameters</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">max_parameters</span><span class="plain"> &gt; 0) </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>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::get_max_parameters</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">max_parameters</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::get_min_parameters</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;min_parameters</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::act_parse_definition is used in <a href="#SP26">&#167;26</a>.</p>
<p class="endnote">The function PL::Actions::is_out_of_world is used in 4/ap (<a href="4-ap.html#SP26_6">&#167;26.6</a>), 5/gl (<a href="5-gl.html#SP22">&#167;22</a>).</p>
<p class="endnote">The function PL::Actions::get_data_type_of_noun is used in 4/ap (<a href="4-ap.html#SP26_5_5">&#167;26.5.5</a>, <a href="4-ap.html#SP26_5_6">&#167;26.5.6</a>, <a href="4-ap.html#SP26_6">&#167;26.6</a>, <a href="4-ap.html#SP29">&#167;29</a>, <a href="4-ap.html#SP34">&#167;34</a>).</p>
<p class="endnote">The function PL::Actions::get_data_type_of_second_noun is used in 4/ap (<a href="4-ap.html#SP26_5_4">&#167;26.5.4</a>, <a href="4-ap.html#SP26_5_5">&#167;26.5.5</a>, <a href="4-ap.html#SP26_5_6">&#167;26.5.6</a>, <a href="4-ap.html#SP26_6">&#167;26.6</a>, <a href="4-ap.html#SP29">&#167;29</a>, <a href="4-ap.html#SP34">&#167;34</a>).</p>
<p class="endnote">The function PL::Actions::set_text_to_name_tensed is used in 4/anl (<a href="4-anl.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function PL::Actions::can_have_parameters is used in 4/anl (<a href="4-anl.html#SP3_2">&#167;3.2</a>, <a href="4-anl.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function PL::Actions::get_max_parameters is used in 4/ap (<a href="4-ap.html#SP5">&#167;5</a>, <a href="4-ap.html#SP26_5_6">&#167;26.5.6</a>, <a href="4-ap.html#SP26_6">&#167;26.6</a>).</p>
<p class="endnote">The function PL::Actions::get_min_parameters is used in 4/ap (<a href="4-ap.html#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. Past tense. </b>Simpler actions &mdash; those with no parameter, or a single parameter which is
a thing &mdash; can be tested in the past tense. The run-time support for this
is a general bitmap revealing which actions have ever happened, plus a
bitmap for each object revealing which have ever been applied to the object
in question. This is where we compile the bitmaps in their fresh, empty form.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::can_be_compiled_in_past_tense</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;min_parameters</span><span class="plain"> &gt; 1) </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">an</span><span class="plain">-&gt;</span><span class="identifier">max_parameters</span><span class="plain"> &gt; 1) </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">an</span><span class="plain">-&gt;</span><span class="identifier">max_parameters</span><span class="plain"> == 1) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_kind</span><span class="plain">, </span><span class="identifier">K_object</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">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">PL::Actions::compile_action_bitmap_property</span><span class="plain">(</span><span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">N</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">I</span><span class="plain">) {</span>
<span class="identifier">R</span><span class="plain"> = </span><span class="identifier">Instances::package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain"> = </span><span class="identifier">Hierarchy::package_within</span><span class="plain">(</span><span class="identifier">INLINE_PROPERTIES_HAP</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="identifier">N</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">INLINE_PROPERTY_HL</span><span class="plain">, </span><span class="identifier">PR</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">R</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::package</span><span class="plain">(</span><span class="identifier">K_object</span><span class="plain">);</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain"> = </span><span class="identifier">Hierarchy::package_within</span><span class="plain">(</span><span class="identifier">KIND_INLINE_PROPERTIES_HAP</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="identifier">N</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">KIND_INLINE_PROPERTY_HL</span><span class="plain">, </span><span class="identifier">PR</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="identifier">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">K_number</span><span class="plain">);</span>
<span class="reserved">for</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="identifier">i</span><span class="plain">&lt;=((</span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain">))/16); </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="identifier">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="identifier">Produce::annotate_i</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">INLINE_ARRAY_IANN</span><span class="plain">, 1);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::ActionHappened</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTIONHAPPENED_HL</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="identifier">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="reserved">for</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="identifier">i</span><span class="plain">&lt;=((</span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain">))/16); </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="identifier">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::can_be_compiled_in_past_tense is used in 4/ap (<a href="4-ap.html#SP35">&#167;35</a>).</p>
<p class="endnote">The function PL::Actions::compile_action_bitmap_property is used in 5/gp (<a href="5-gp.html#SP10_3">&#167;10.3</a>).</p>
<p class="endnote">The function PL::Actions::ActionHappened appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP34"></a><b>&#167;34. The grammar list. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::add_gl</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">grammar_line</span><span class="plain"> *</span><span class="identifier">gl</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;list_with_action</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;list_with_action</span><span class="plain"> = </span><span class="identifier">gl</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::Parsing::Lines::list_with_action_add</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;list_with_action</span><span class="plain">, </span><span class="identifier">gl</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::remove_gl</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
<span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;list_with_action</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::add_gl is used in 5/gl (<a href="5-gl.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function PL::Actions::remove_gl is used in 5/tfg (<a href="5-tfg.html#SP20">&#167;20</a>).</p>
<p class="inwebparagraph"><a id="SP35"></a><b>&#167;35. Typechecking grammar for an action. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::check_types_for_grammar</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">tok_values</span><span class="plain">,</span>
<span class="identifier">kind</span><span class="plain"> **</span><span class="identifier">tok_value_kinds</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">required</span><span class="plain"> = 0; </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">failed_on</span><span class="plain"> = </span><span class="string">"&lt;internal error&gt;"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_access</span><span class="plain"> != </span><span class="constant">IMPOSSIBLE_ACCESS</span><span class="plain">)</span>
<span class="identifier">required</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_access</span><span class="plain"> != </span><span class="constant">IMPOSSIBLE_ACCESS</span><span class="plain">)</span>
<span class="identifier">required</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">required</span><span class="plain"> &lt; </span><span class="identifier">tok_values</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">required</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> 0:</span>
<span class="identifier">failed_on</span><span class="plain"> =</span>
<span class="string">"this action applies to nothing, but you have provided "</span>
<span class="string">"material in square brackets which expands to something"</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 1:</span>
<span class="identifier">failed_on</span><span class="plain"> =</span>
<span class="string">"this action applies to just one thing, but you have "</span>
<span class="string">"put more than one thing in square brackets"</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="identifier">failed_on</span><span class="plain"> =</span>
<span class="string">"this action applies to two things, the maximum possible, "</span>
<span class="string">"but you have put more than two in square brackets"</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Unmatched</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tok_values</span><span class="plain"> &gt;= 1) {</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_access</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">UNRESTRICTED_ACCESS</span><span class="plain">: {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">supplied_data_type</span><span class="plain"> = </span><span class="identifier">tok_value_kinds</span><span class="plain">[0];</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">desired_data_type</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_kind</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">supplied_data_type</span><span class="plain">, </span><span class="identifier">desired_data_type</span><span class="plain">)</span>
<span class="plain">!= </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">) {</span>
<span class="identifier">failed_on</span><span class="plain"> =</span>
<span class="string">"the thing you suggest this action should act on "</span>
<span class="string">"has the wrong kind of value"</span><span class="plain">;</span>
<span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Unmatched</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">REQUIRES_ACCESS</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">REQUIRES_POSSESSION</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DOESNT_REQUIRE_ACCESS</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">tok_value_kinds</span><span class="plain">[0], </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">failed_on</span><span class="plain"> =</span>
<span class="string">"the thing you suggest this action should act on "</span>
<span class="string">"is not an object at all"</span><span class="plain">;</span>
<span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Unmatched</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tok_values</span><span class="plain"> == 2) {</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_access</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">UNRESTRICTED_ACCESS</span><span class="plain">: {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">supplied_data_type</span><span class="plain"> = </span><span class="identifier">tok_value_kinds</span><span class="plain">[1];</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">desired_data_type</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_kind</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">supplied_data_type</span><span class="plain">, </span><span class="identifier">desired_data_type</span><span class="plain">)</span>
<span class="plain">!= </span><span class="identifier">ALWAYS_MATCH</span><span class="plain">) {</span>
<span class="identifier">failed_on</span><span class="plain"> =</span>
<span class="string">"the second thing you suggest this action should act on "</span>
<span class="string">"has the wrong kind of value"</span><span class="plain">;</span>
<span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Unmatched</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">REQUIRES_ACCESS</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">REQUIRES_POSSESSION</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DOESNT_REQUIRE_ACCESS</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">tok_value_kinds</span><span class="plain">[1], </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">failed_on</span><span class="plain"> =</span>
<span class="string">"the second thing you suggest this action should act on "</span>
<span class="string">"is not an object at all"</span><span class="plain">;</span>
<span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Unmatched</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">Unmatched</span><span class="plain">:</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%d token values supplied\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">tok_values</span><span class="plain">);</span>
<span class="plain">{ </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">tok_values</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Token value %d: $u\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">tok_value_kinds</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Expected noun K: $u\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_kind</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Expected second K: $u\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_kind</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Noun access level: %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_access</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Second access level: %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_access</span><span class="plain">);</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="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;designers_specification</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">Problems::quote_text</span><span class="plain">(2, </span><span class="string">"&lt;none given&gt;"</span><span class="plain">);</span>
<span class="reserved">else</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">an</span><span class="plain">-</span><span class="element">&gt;designers_specification</span><span class="plain">));</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(3, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">);</span>
<span class="identifier">Problems::quote_text</span><span class="plain">(4, </span><span class="identifier">failed_on</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_GrammarMismatchesAction</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span><span class="string">"The grammar you give in %1 is not compatible "</span>
<span class="string">"with the %3 action (defined as '%2') - %4."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::check_types_for_grammar is used in 5/gl (<a href="5-gl.html#SP20">&#167;20</a>).</p>
<p class="inwebparagraph"><a id="SP36"></a><b>&#167;36. Compiling data about actions. </b>In I6, there was no common infrastructure for the implementation of
actions: each defined its own <code class="display"><span class="extract">-Sub</span></code> routine. Here, we do have a common
infrastructure, and we access it with a single call.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::compile_action_routines</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;use_verb_routine_in_I6_library</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Sub</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="identifier">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">RETURN_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">generic_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">GENERICVERBSUB_HL</span><span class="plain">);</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">generic_iname</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;check_rules</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;carry_out_rules</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;report_rules</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::compile_action_routines appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP37"></a><b>&#167;37. Compiling data about actions. </b>There are also collective tables of data about actions.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::ActionData</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext">PL::Actions::compile_action_name_var_creators</span><span class="plain">();</span>
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mn</span><span class="plain">, </span><span class="identifier">ms</span><span class="plain">, </span><span class="identifier">ml</span><span class="plain">, </span><span class="identifier">mnp</span><span class="plain">, </span><span class="identifier">msp</span><span class="plain">, </span><span class="identifier">hn</span><span class="plain">, </span><span class="identifier">hs</span><span class="plain">, </span><span class="identifier">record_count</span><span class="plain"> = 0;</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTIONDATA_HL</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="identifier">Emit::named_table_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">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;use_verb_routine_in_I6_library</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="identifier">mn</span><span class="plain"> = 0; </span><span class="identifier">ms</span><span class="plain"> = 0; </span><span class="identifier">ml</span><span class="plain"> = 0; </span><span class="identifier">mnp</span><span class="plain"> = 1; </span><span class="identifier">msp</span><span class="plain"> = 1; </span><span class="identifier">hn</span><span class="plain"> = 0; </span><span class="identifier">hs</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;requires_light</span><span class="plain">) </span><span class="identifier">ml</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;noun_access</span><span class="plain"> == </span><span class="constant">REQUIRES_ACCESS</span><span class="plain">) </span><span class="identifier">mn</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;second_access</span><span class="plain"> == </span><span class="constant">REQUIRES_ACCESS</span><span class="plain">) </span><span class="identifier">ms</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;noun_access</span><span class="plain"> == </span><span class="constant">REQUIRES_POSSESSION</span><span class="plain">) { </span><span class="identifier">mn</span><span class="plain"> = 1; </span><span class="identifier">hn</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;second_access</span><span class="plain"> == </span><span class="constant">REQUIRES_POSSESSION</span><span class="plain">) { </span><span class="identifier">ms</span><span class="plain"> = 1; </span><span class="identifier">hs</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;noun_access</span><span class="plain"> == </span><span class="constant">IMPOSSIBLE_ACCESS</span><span class="plain">) </span><span class="identifier">mnp</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_access</span><span class="plain"> == </span><span class="constant">IMPOSSIBLE_ACCESS</span><span class="plain">) </span><span class="identifier">msp</span><span class="plain"> = 0;</span>
<span class="identifier">record_count</span><span class="plain">++;</span>
<span class="identifier">Emit::array_action_entry</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">bitmap</span><span class="plain"> = (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">mn</span><span class="plain"> + </span><span class="identifier">ms</span><span class="plain">*0</span><span class="identifier">x02</span><span class="plain"> + </span><span class="identifier">ml</span><span class="plain">*0</span><span class="identifier">x04</span><span class="plain"> + </span><span class="identifier">mnp</span><span class="plain">*0</span><span class="identifier">x08</span><span class="plain"> +</span>
<span class="identifier">msp</span><span class="plain">*0</span><span class="identifier">x10</span><span class="plain"> + ((</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;out_of_world</span><span class="plain">)?1:0)*0</span><span class="identifier">x20</span><span class="plain"> + </span><span class="identifier">hn</span><span class="plain">*0</span><span class="identifier">x40</span><span class="plain"> + </span><span class="identifier">hs</span><span class="plain">*0</span><span class="identifier">x80</span><span class="plain">);</span>
<span class="identifier">Emit::array_numeric_entry</span><span class="plain">(</span><span class="identifier">bitmap</span><span class="plain">);</span>
<span class="identifier">Kinds::RunTime::emit_strong_id</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_kind</span><span class="plain">);</span>
<span class="identifier">Kinds::RunTime::emit_strong_id</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_kind</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">StackedVariables::owner_empty</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
<span class="identifier">Emit::array_iname_entry</span><span class="plain">(</span><span class="identifier">StackedVariables::frame_creator</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">));</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="identifier">Emit::array_numeric_entry</span><span class="plain">((</span><span class="identifier">inter_t</span><span class="plain">) (20000+</span><span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="identifier">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">ad_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">AD_RECORDS_HL</span><span class="plain">);</span>
<span class="identifier">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">ad_iname</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">record_count</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">ad_iname</span><span class="plain">);</span>
<span class="identifier">VirtualMachines::note_usage</span><span class="plain">(</span><span class="string">"action"</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 12, 0, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">DB_Action_Details_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">DB_ACTION_DETAILS_HL</span><span class="plain">);</span>
<span class="identifier">save</span><span class="plain"> = </span><span class="identifier">Routines::begin</span><span class="plain">(</span><span class="identifier">DB_Action_Details_iname</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">act_s</span><span class="plain"> = </span><span class="identifier">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"act"</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">n_s</span><span class="plain"> = </span><span class="identifier">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"n"</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">s_s</span><span class="plain"> = </span><span class="identifier">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"s"</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">for_say_s</span><span class="plain"> = </span><span class="identifier">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"for_say"</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">SWITCH_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">act_s</span><span class="plain">);</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;use_verb_routine_in_I6_library</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">CASE_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">PL::Actions::double_sharp</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">));</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">), </span><span class="identifier">j0</span><span class="plain"> = -1, </span><span class="identifier">somethings</span><span class="plain"> = 0, </span><span class="identifier">clc</span><span class="plain"> = 0;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"> &lt;= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">&gt;(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">j0</span><span class="plain"> &gt;= 0) {</span>
&lt;<span class="cwebmacro">Insert a space here if needed to break up the action name</span> <span class="cwebmacronumber">37.1</span>&gt;<span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">AT</span><span class="plain">);</span>
<span class="functiontext">PL::Actions::print_action_text_to</span><span class="plain">(</span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">j0</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">-1), </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">), </span><span class="identifier">AT</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">AT</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">AT</span><span class="plain">);</span>
<span class="identifier">j0</span><span class="plain"> = -1;</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Insert a space here if needed to break up the action name</span> <span class="cwebmacronumber">37.1</span>&gt;<span class="plain">;</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">IFELSE_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">for_say_s</span><span class="plain">);</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 2);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"it"</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">PL::Actions::cat_something2</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">somethings</span><span class="plain">++, </span><span class="identifier">n_s</span><span class="plain">, </span><span class="identifier">s_s</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">j0</span><span class="plain">&lt;0) </span><span class="identifier">j0</span><span class="plain"> = </span><span class="identifier">j</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">j</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">j0</span><span class="plain"> &gt;= 0) {</span>
&lt;<span class="cwebmacro">Insert a space here if needed to break up the action name</span> <span class="cwebmacronumber">37.1</span>&gt;<span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">AT</span><span class="plain">);</span>
<span class="functiontext">PL::Actions::print_action_text_to</span><span class="plain">(</span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">j0</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">-1), </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">), </span><span class="identifier">AT</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">AT</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">AT</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">somethings</span><span class="plain"> &lt; </span><span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">max_parameters</span><span class="plain">) {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">NE_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">for_say_s</span><span class="plain">);</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 2);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
&lt;<span class="cwebmacro">Insert a space here if needed to break up the action name</span> <span class="cwebmacronumber">37.1</span>&gt;<span class="plain">;</span>
<span class="functiontext">PL::Actions::cat_something2</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">somethings</span><span class="plain">++, </span><span class="identifier">n_s</span><span class="plain">, </span><span class="identifier">s_s</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">DB_Action_Details_iname</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::ActionData appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP37_1"></a><b>&#167;37.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Insert a space here if needed to break up the action name</span> <span class="cwebmacronumber">37.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clc</span><span class="plain">++ &gt; 0) {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP37">&#167;37</a> (four times).</p>
<p class="inwebparagraph"><a id="SP38"></a><b>&#167;38. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::cat_something2</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">n_s</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">s_s</span><span class="plain">) {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_kind</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var</span><span class="plain"> = </span><span class="identifier">n_s</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> &gt; 0) {</span>
<span class="identifier">K</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_kind</span><span class="plain">; </span><span class="identifier">var</span><span class="plain"> = </span><span class="identifier">s_s</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">var</span><span class="plain"> = </span><span class="identifier">InterNames::to_symbol</span><span class="plain">(</span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PARSED_NUMBER_HL</span><span class="plain">));</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">INDIRECT1V_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Kinds::Behaviour::get_name_of_printing_rule_ACTIONS</span><span class="plain">(</span><span class="identifier">K</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">K</span><span class="plain">, </span><span class="identifier">K_understanding</span><span class="plain">)) {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">PLUS_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">TIMES_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 100);</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">CONSULT_FROM_HL</span><span class="plain">));</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">CONSULT_WORDS_HL</span><span class="plain">));</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">var</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::print_action_text_to</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">start</span><span class="plain">, </span><span class="identifier">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) == </span><span class="identifier">start</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">Wordings::first_word</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Wordings::trim_first_word</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="identifier">Wordings::empty</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="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::ActionCoding_array</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTIONCODING_HL</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="identifier">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="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_first_char</span><span class="plain">(</span><span class="functiontext">PL::Actions::identifier</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">)) == </span><span class="character">'_'</span><span class="plain">) </span><span class="identifier">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Emit::array_action_entry</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::cat_something2 is used in <a href="#SP37">&#167;37</a>.</p>
<p class="endnote">The function PL::Actions::print_action_text_to is used in <a href="#SP37">&#167;37</a>.</p>
<p class="endnote">The function PL::Actions::ActionCoding_array appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP39"></a><b>&#167;39. Indexing. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::index</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pass</span><span class="plain">,</span>
<span class="identifier">extension_file</span><span class="plain"> **</span><span class="identifier">ext</span><span class="plain">, </span><span class="identifier">heading</span><span class="plain"> **</span><span class="identifier">current_area</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">new_par</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bold</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">on_details_page</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;use_verb_routine_in_I6_library</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">f</span><span class="plain">;</span>
<span class="identifier">heading</span><span class="plain"> *</span><span class="identifier">definition_area</span><span class="plain"> = </span><span class="identifier">Sentences::Headings::of_wording</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">new_par</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">pass</span><span class="plain"> == 1) {</span>
<span class="identifier">extension_file</span><span class="plain"> *</span><span class="identifier">this_extension</span><span class="plain"> =</span>
<span class="identifier">Sentences::Headings::get_extension_containing</span><span class="plain">(</span><span class="identifier">definition_area</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (*</span><span class="identifier">ext</span><span class="plain"> != </span><span class="identifier">this_extension</span><span class="plain">) {</span>
<span class="plain">*</span><span class="identifier">ext</span><span class="plain"> = </span><span class="identifier">this_extension</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (*</span><span class="identifier">ext</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">f</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="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;New actions defined in the source&lt;/b&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="identifier">f</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">new_par</span><span class="plain"> = </span><span class="identifier">TRUE</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">ext</span><span class="plain"> != </span><span class="identifier">standard_rules_extension</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</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="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;Actions defined by the extension "</span><span class="plain">);</span>
<span class="identifier">Extensions::Files::write_name_to_file</span><span class="plain">(*</span><span class="identifier">ext</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" by "</span><span class="plain">);</span>
<span class="identifier">Extensions::Files::write_author_to_file</span><span class="plain">(*</span><span class="identifier">ext</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/b&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="identifier">f</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">new_par</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">definition_area</span><span class="plain"> != *</span><span class="identifier">current_area</span><span class="plain">) &amp;&amp; (*</span><span class="identifier">ext</span><span class="plain"> == </span><span class="identifier">standard_rules_extension</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</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="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</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="identifier">Sentences::Headings::get_text</span><span class="plain">(</span><span class="identifier">definition_area</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">W</span><span class="plain">)) {</span>
<span class="identifier">Phrases::Index::index_definition_area</span><span class="plain">(</span><span class="identifier">OUT</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><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (*</span><span class="identifier">ext</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"New actions"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/b&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">f</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">new_par</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 1) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", "</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">new_par</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">new_par</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">f</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">current_area</span><span class="plain"> = </span><span class="identifier">definition_area</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 2) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;out_of_world</span><span class="plain">) </span><span class="identifier">HTML::begin_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"800000"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 1) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bold</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bold</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/b&gt;"</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">somethings</span><span class="plain"> = 0;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"> &lt;= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;present_name</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">&gt;(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">))) {</span>
<span class="functiontext">PL::Actions::act_index_something</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">somethings</span><span class="plain">++);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</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">j</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="identifier">j</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">somethings</span><span class="plain"> &lt; </span><span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">max_parameters</span><span class="plain">)</span>
<span class="functiontext">PL::Actions::act_index_something</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">somethings</span><span class="plain">++);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;out_of_world</span><span class="plain">) </span><span class="identifier">HTML::end_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == 2) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">swn</span><span class="plain"> = </span><span class="functiontext">PL::Actions::an_get_specification_text</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/b&gt;"</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">an</span><span class="plain">-</span><span class="element">&gt;designers_specification</span><span class="plain">)));</span>
<span class="identifier">Index::anchor</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="functiontext">PL::Actions::identifier</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;requires_light</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (requires light)"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (&lt;i&gt;past tense&lt;/i&gt; %+W)"</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;past_name</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="reserved">if</span><span class="plain"> (</span><span class="identifier">swn</span><span class="plain"> &gt;= 0) { </span><span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</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">swn</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="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"hr"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;Typed commands leading to this action&lt;/b&gt;\</span><span class="plain">n</span><span class="string">"</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="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Parsing::Lines::index_list_with_action</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;list_with_action</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;None&lt;/i&gt;"</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="reserved">if</span><span class="plain"> (</span><span class="identifier">StackedVariables::owner_empty</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;Named values belonging to this action&lt;/b&gt;\</span><span class="plain">n</span><span class="string">"</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="identifier">StackedVariables::index_owner</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;owned_by_an</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;Rules controlling this action&lt;/b&gt;"</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="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">resp_count</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;out_of_world</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">Rulebooks::index_action_rules</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">PERSUASION_RB</span><span class="plain">, </span><span class="string">"persuasion"</span><span class="plain">, &amp;</span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="identifier">Rulebooks::index_action_rules</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">UNSUCCESSFUL_ATTEMPT_BY_RB</span><span class="plain">, </span><span class="string">"unsuccessful attempt"</span><span class="plain">, &amp;</span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="identifier">Rulebooks::index_action_rules</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">SETTING_ACTION_VARIABLES_RB</span><span class="plain">, </span><span class="string">"set action variables for"</span><span class="plain">, &amp;</span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="identifier">Rulebooks::index_action_rules</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">BEFORE_RB</span><span class="plain">, </span><span class="string">"before"</span><span class="plain">, &amp;</span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="identifier">Rulebooks::index_action_rules</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">INSTEAD_RB</span><span class="plain">, </span><span class="string">"instead of"</span><span class="plain">, &amp;</span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">Rulebooks::index_action_rules</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;check_rules</span><span class="plain">, </span><span class="identifier">CHECK_RB</span><span class="plain">, </span><span class="string">"check"</span><span class="plain">, &amp;</span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="identifier">Rulebooks::index_action_rules</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;carry_out_rules</span><span class="plain">, </span><span class="identifier">CARRY_OUT_RB</span><span class="plain">, </span><span class="string">"carry out"</span><span class="plain">, &amp;</span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;out_of_world</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">Rulebooks::index_action_rules</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">AFTER_RB</span><span class="plain">, </span><span class="string">"after"</span><span class="plain">, &amp;</span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="identifier">Rulebooks::index_action_rules</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;report_rules</span><span class="plain">, </span><span class="identifier">REPORT_RB</span><span class="plain">, </span><span class="string">"report"</span><span class="plain">, &amp;</span><span class="identifier">resp_count</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">resp_count</span><span class="plain"> &gt; 1) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Click on the speech-bubble icons to see the responses, "</span>
<span class="string">"or here to see all of them:"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;"</span><span class="plain">);</span>
<span class="identifier">Index::extra_link_with</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, 2000000, </span><span class="string">"responses"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">resp_count</span><span class="plain">);</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="reserved">else</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">an</span><span class="plain">-</span><span class="element">&gt;designers_specification</span><span class="plain">)));</span>
<span class="identifier">Index::detail_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"A"</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">, (</span><span class="identifier">on_details_page</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>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">f</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::act_index_something</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">) {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">redundant assignment to appease <code class="display"><span class="extract">gcc -O2</span></code></span>
<span class="identifier">HTML::begin_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"000080"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">argc</span><span class="plain"> == 0) </span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;noun_kind</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">argc</span><span class="plain"> == 1) </span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">-</span><span class="element">&gt;second_kind</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"something"</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">K</span><span class="plain">, </span><span class="identifier">K_understanding</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"some text"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Kinds::Textual::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
<span class="identifier">HTML::end_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Actions::index is used in 4/ai (<a href="4-ai.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function PL::Actions::act_index_something appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 4: Actions.)</i></li><li><a href="4-anl.html">Continue with 'Action Name Lists'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>