mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 08:34:22 +03:00
1934 lines
272 KiB
HTML
1934 lines
272 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">★</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">§1. Definitions</a></li><li><a href="#SP23">§23. Action variables</a></li><li><a href="#SP33">§33. Past tense</a></li><li><a href="#SP34">§34. The grammar list</a></li><li><a href="#SP35">§35. Typechecking grammar for an action</a></li><li><a href="#SP36">§36. Compiling data about actions</a></li><li><a href="#SP37">§37. Compiling data about actions</a></li><li><a href="#SP39">§39. Indexing</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§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>§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 — which I6 allowed, thus
|
|
parsing "listen" and "listen to the frog" as the same action, with
|
|
0 and 1 parameters respectively — 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>§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>§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>§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>§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>§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>§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">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§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">§8</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::actions_offered_property is used in <a href="#SP8">§8</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::actions_offered_specification is used in <a href="#SP8">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§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">)) &&</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">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§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">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§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>§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"><</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">actions</span><span class="plain">> ::=</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>§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"><</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">> ::=</span>
|
|
<span class="plain">...</span><span class="element"> action</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§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"> (<</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">actions</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">r</span><span class="plain">>> == 1) && (</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"> ((<<</span><span class="identifier">r</span><span class="plain">>> == 0) && (</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">>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">>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">>present_name</span><span class="plain">);</span>
|
|
<span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>min_parameters</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">an</span><span class="plain">-></span><span class="identifier">max_parameters</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>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">(<</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">>, 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">(&</span><span class="identifier">wa</span><span class="plain">);</span>
|
|
<span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>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">>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">>an_package</span><span class="plain">);</span>
|
|
<span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>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">>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">>an_package</span><span class="plain">);</span>
|
|
<span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>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">>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">>an_package</span><span class="plain">);</span>
|
|
<span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>report_rules</span><span class="plain">, 1);</span>
|
|
|
|
<span class="identifier">an</span><span class="plain">-</span><span class="element">>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">-></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">>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">>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">>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">§28</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§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 <action-pronoun> 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"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">accusative</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">></span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§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">>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">>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"> <= </span><span class="identifier">Wordings::last_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::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"> ((<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">>(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">))) && (</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"> ((<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</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="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">"<null-action-name>"</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">>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">§16</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::log is used in 1/im (<a href="1-im.html#SP4">§4</a>, <a href="1-im.html#SP4_4">§4.4</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§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"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">> </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">>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"> (<</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">>(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">>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">(<</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">>, 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>§20. </b>However, <action-name> 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"><</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">> ::=</span>
|
|
<span class="plain">... </span><span class="identifier">to</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP21"></a><b>§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">-></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">>present_name</span><span class="plain">) : (</span><span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>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">>translated_name</span><span class="plain">) > 0)</span>
|
|
<span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>translated_name</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">>an_package</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>an_package</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>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">-></span><span class="identifier">allocation_id</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::annotate_i</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>an_package</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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">§26.3</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::it_optional is used in 4/anl (<a href="4-anl.html#SP9">§9</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::abbreviable is used in 4/anl (<a href="4-anl.html#SP9">§9</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::identifier is used in <a href="#SP38">§38</a>, <a href="#SP39">§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">§22</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::double_sharp is used in <a href="#SP37">§37</a>, 4/anl (<a href="4-anl.html#SP9">§9</a>), 4/ap (<a href="4-ap.html#SP29">§29</a>, <a href="4-ap.html#SP35">§35</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Sub is used in <a href="#SP36">§36</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::iname is used in <a href="#SP10">§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">§10</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::an_get_specification_text is used in <a href="#SP39">§39</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22"></a><b>§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"> (<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">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="identifier">rp</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">"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">>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">>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">>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">>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">>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">>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">>present_name</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (!(<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">>(</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">§9</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23"></a><b>§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"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</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">> ( </span><span class="identifier">matched</span><span class="plain"> </span><span class="identifier">as</span><span class="plain"> {<</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">>} ) | ==> </span><span class="identifier">TRUE</span>
|
|
<span class="plain"><</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">> ( ... ) | ==> </span><<span class="cwebmacro">Issue PM_BadMatchingSyntax problem</span> <span class="cwebmacronumber">23.2</span>>
|
|
<span class="plain"><</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">> ==> </span><span class="identifier">FALSE</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23_1"></a><b>§23.1. </b>And the new action variable name is vetted by being run through this:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</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">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">unfortunate</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">> | ==> </span><<span class="cwebmacro">Issue PM_ActionVarAnd problem</span> <span class="cwebmacronumber">23.1.1</span>>
|
|
<span class="plain">... ==> </span><span class="identifier">TRUE</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23_2"></a><b>§23.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_BadMatchingSyntax problem</span> <span class="cwebmacronumber">23.2</span>> =
|
|
</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">§23</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23_1_1"></a><b>§23.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_ActionVarAnd problem</span> <span class="cwebmacronumber">23.1.1</span>> =
|
|
</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">§23.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP24"></a><b>§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">>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">-></span><span class="identifier">down</span><span class="plain">-</span><span class="element">>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">-></span><span class="identifier">down</span><span class="plain">-</span><span class="element">>next</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-></span><span class="identifier">down</span><span class="plain">-</span><span class="element">>next</span><span class="plain">))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<<</span><span class="identifier">r</span><span class="plain">>> == </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">(<</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">>, 1);</span>
|
|
<span class="reserved">if</span><span class="plain"> (<<</span><span class="identifier">r</span><span class="plain">>>) {</span>
|
|
<span class="identifier">MW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">>, 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">) > 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"> (<</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-></span><span class="identifier">down</span><span class="plain">))) </span><span class="identifier">K</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</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"> (<</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">type</span><span class="plain">-</span><span class="identifier">expression</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">cnode</span><span class="plain">-></span><span class="identifier">down</span><span class="plain">))) </span><span class="identifier">spec</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</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">-></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">-></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">-></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">>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">>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">>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">-></span><span class="identifier">down</span><span class="plain">-</span><span class="element">>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">>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">>owned_by_an</span><span class="plain">) &&</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">>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">>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">>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">§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">§26.3</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::compile_action_name_var_creators is used in <a href="#SP37">§37</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP25"></a><b>§25. </b>This handles the special meaning "X is an action...".
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</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="plain"><</span><span class="identifier">indefinite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">> <</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">> | ==> </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"><</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">> ==> </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"><</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">> ::=</span>
|
|
<span class="identifier">action</span><span class="plain"> <</span><span class="identifier">nounphrase</span><span class="plain">-</span><span class="identifier">actionable</span><span class="plain">> | ==> </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"> ==> </span><<span class="cwebmacro">Issue PM_BadActionDeclaration problem</span> <span class="cwebmacronumber">25.1</span>>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP25_1"></a><b>§25.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_BadActionDeclaration problem</span> <span class="cwebmacronumber">25.1</span>> =
|
|
</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">§25</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26"></a><b>§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"> (<</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">OW</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<<</span><span class="identifier">r</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="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"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="plain"><</span><span class="identifier">nounphrase</span><span class="plain">>(</span><span class="identifier">SW</span><span class="plain">);</span>
|
|
<span class="identifier">V</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="identifier">V</span><span class="plain">-</span><span class="element">>next</span><span class="plain">-</span><span class="element">>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>§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>§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 — it's the name of the
|
|
action to be created.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<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">subject</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">> | ==> </span><<span class="cwebmacro">Issue PM_ActionAlreadyExists problem</span> <span class="cwebmacronumber">28.1</span>>
|
|
<span class="plain">... ==> 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>§28.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_ActionAlreadyExists problem</span> <span class="cwebmacronumber">28.1</span>> =
|
|
</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">§28</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP29"></a><b>§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"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">> ::=</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"> | ==> </span><span class="constant">OOW_ACT_CLAUSE</span>
|
|
<span class="identifier">abbreviable</span><span class="plain"> | ==> </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"> ... | ==> </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"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">applications</span><span class="plain">> | ==> </span><span class="constant">APPLYING_ACT_CLAUSE</span><span class="plain">; <<</span><span class="identifier">num</span><span class="plain">>> = </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"> ==> </span><span class="constant">LIGHT_ACT_CLAUSE</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">applications</span><span class="plain">> ::=</span>
|
|
<span class="identifier">nothing</span><span class="plain"> | ==> 0</span>
|
|
<span class="identifier">one</span><span class="plain"> <</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> </span><span class="identifier">and</span><span class="plain"> </span><span class="identifier">one</span><span class="plain"> <</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> | ==> 2; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[1]; <<</span><span class="identifier">ac1</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[1]; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[2]; <<</span><span class="identifier">ac2</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[2]</span>
|
|
<span class="identifier">one</span><span class="plain"> <</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> </span><span class="identifier">and</span><span class="plain"> <</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> | ==> 2; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[1]; <<</span><span class="identifier">ac1</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[1]; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[2]; <<</span><span class="identifier">ac2</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[2]</span>
|
|
<span class="plain"><</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> </span><span class="identifier">and</span><span class="plain"> </span><span class="identifier">one</span><span class="plain"> <</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> | ==> 2; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[1]; <<</span><span class="identifier">ac1</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[1]; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[2]; <<</span><span class="identifier">ac2</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[2]</span>
|
|
<span class="plain"><</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> </span><span class="identifier">and</span><span class="plain"> <</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> | ==> 2; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[1]; <<</span><span class="identifier">ac1</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[1]; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[2]; <<</span><span class="identifier">ac2</span><span class="plain">>> = </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"> <</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> | ==> -1; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[1]; <<</span><span class="identifier">ac1</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="identifier">one</span><span class="plain"> <</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> | ==> 1; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[1]; <<</span><span class="identifier">ac1</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="identifier">two</span><span class="plain"> <</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> | ==> 2; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[1]; <<</span><span class="identifier">ac1</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[1]; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[1]; <<</span><span class="identifier">ac2</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="plain"><</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> | ==> 1; <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">>> = </span><span class="identifier">RP</span><span class="plain">[1]; <<</span><span class="identifier">ac1</span><span class="plain">>> = </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="plain">... ==> </span><<span class="cwebmacro">Issue PM_ActionMisapplied problem</span> <span class="cwebmacronumber">29.2</span>><span class="plain">;</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">act</span><span class="plain">-</span><span class="identifier">req</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">access</span><span class="plain">> <</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">> | ==> </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><<span class="cwebmacro">Check action kind</span> <span class="cwebmacronumber">29.1</span>><span class="plain">;</span>
|
|
<span class="plain"><</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">> ==> </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><<span class="cwebmacro">Check action kind</span> <span class="cwebmacronumber">29.1</span>><span class="plain">;</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">access</span><span class="plain">> ::=</span>
|
|
<span class="identifier">visible</span><span class="plain"> | ==> </span><span class="constant">DOESNT_REQUIRE_ACCESS</span>
|
|
<span class="identifier">touchable</span><span class="plain"> | ==> </span><span class="constant">REQUIRES_ACCESS</span>
|
|
<span class="identifier">carried</span><span class="plain"> ==> </span><span class="constant">REQUIRES_POSSESSION</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP30"></a><b>§30. </b>We are now able to define this peculiar form of list of action clauses:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<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="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clauses</span><span class="plain">> | ==> 0</span>
|
|
<span class="plain">... ==> </span><<span class="cwebmacro">Issue PM_ActionClauseUnknown problem</span> <span class="cwebmacronumber">30.1</span>>
|
|
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clauses</span><span class="plain">> ::=</span>
|
|
<span class="plain">... | ==> 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"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clauses</span><span class="plain">> <</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">> | ==> </span><span class="identifier">R</span><span class="plain">[2]; </span><<span class="cwebmacro">Act on this action information</span> <span class="cwebmacronumber">30.2</span>>
|
|
<span class="plain"><</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">> ==> </span><span class="identifier">R</span><span class="plain">[1]; </span><<span class="cwebmacro">Act on this action information</span> <span class="cwebmacronumber">30.2</span>>
|
|
|
|
<span class="plain"><</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">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">> , </span><span class="identifier">and</span><span class="plain"> | ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">> </span><span class="identifier">and</span><span class="plain"> | ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">> , | ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">> ==> </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>§30.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_ActionClauseUnknown problem</span> <span class="cwebmacronumber">30.1</span>> =
|
|
</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">§30</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP30_2"></a><b>§30.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Act on this action information</span> <span class="cwebmacronumber">30.2</span>> =
|
|
</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">>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">(<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">clause</span><span class="plain">>, 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">>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">>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">>noun_access</span><span class="plain"> = <<</span><span class="identifier">ac1</span><span class="plain">>>; </span><span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">>second_access</span><span class="plain"> = <<</span><span class="identifier">ac2</span><span class="plain">>>;</span>
|
|
<span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">>noun_kind</span><span class="plain"> = <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">>>; </span><span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">>second_kind</span><span class="plain"> = <<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">>>;</span>
|
|
<span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">>min_parameters</span><span class="plain"> = <<</span><span class="identifier">num</span><span class="plain">>>;</span>
|
|
<span class="identifier">an_being_parsed</span><span class="plain">-></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">>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">>min_parameters</span><span class="plain"> == -1) {</span>
|
|
<span class="identifier">an_being_parsed</span><span class="plain">-</span><span class="element">>min_parameters</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">an_being_parsed</span><span class="plain">-></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">>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">>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">§30</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP29_1"></a><b>§29.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Check action kind</span> <span class="cwebmacronumber">29.1</span>> =
|
|
</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>
|
|
<<span class="cwebmacro">Issue PM_ActionMisapplied problem</span> <span class="cwebmacronumber">29.2</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">X</span><span class="plain"> != </span><span class="constant">UNRESTRICTED_ACCESS</span><span class="plain">) </span><<span class="cwebmacro">Issue PM_ActionMisapplied problem</span> <span class="cwebmacronumber">29.2</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP29">§29</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP29_2"></a><b>§29.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_ActionMisapplied problem</span> <span class="cwebmacronumber">29.2</span>> =
|
|
</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">§29</a>, <a href="#SP29_1">§29.1</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP31"></a><b>§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">) > 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">§30.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP32"></a><b>§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"><</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">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">>next</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">rp</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="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">>next</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">an</span><span class="plain">-</span><span class="element">>designers_specification</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-</span><span class="element">>next</span><span class="plain">-</span><span class="element">>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"><<</span><span class="identifier">ac1</span><span class="plain">>> = </span><span class="constant">IMPOSSIBLE_ACCESS</span><span class="plain">;</span>
|
|
<span class="plain"><<</span><span class="identifier">ac2</span><span class="plain">>> = </span><span class="constant">IMPOSSIBLE_ACCESS</span><span class="plain">;</span>
|
|
<span class="plain"><<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op1</span><span class="plain">>> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
<span class="plain"><<</span><span class="identifier">kind</span><span class="plain">:</span><span class="identifier">op2</span><span class="plain">>> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
<span class="plain"><<</span><span class="identifier">num</span><span class="plain">>> = 0;</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">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">>next</span><span class="plain">-</span><span class="element">>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">-></span><span class="identifier">max_parameters</span><span class="plain"> >= 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">>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="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">>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">>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">>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">>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">>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">>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">-></span><span class="identifier">max_parameters</span><span class="plain"> > 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">-></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">>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">§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">§26.6</a>), 5/gl (<a href="5-gl.html#SP22">§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">§26.5.5</a>, <a href="4-ap.html#SP26_5_6">§26.5.6</a>, <a href="4-ap.html#SP26_6">§26.6</a>, <a href="4-ap.html#SP29">§29</a>, <a href="4-ap.html#SP34">§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">§26.5.4</a>, <a href="4-ap.html#SP26_5_5">§26.5.5</a>, <a href="4-ap.html#SP26_5_6">§26.5.6</a>, <a href="4-ap.html#SP26_6">§26.6</a>, <a href="4-ap.html#SP29">§29</a>, <a href="4-ap.html#SP34">§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">§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">§3.2</a>, <a href="4-anl.html#SP9">§9</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::get_max_parameters is used in 4/ap (<a href="4-ap.html#SP5">§5</a>, <a href="4-ap.html#SP26_5_6">§26.5.6</a>, <a href="4-ap.html#SP26_6">§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">§5</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP33"></a><b>§33. Past tense. </b>Simpler actions — those with no parameter, or a single parameter which is
|
|
a thing — 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">>min_parameters</span><span class="plain"> > 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">-></span><span class="identifier">max_parameters</span><span class="plain"> > 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">-></span><span class="identifier">max_parameters</span><span class="plain"> == 1) &&</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">>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"><=((</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">Emit::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"><=((</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="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">§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">§10.3</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::ActionHappened appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34"></a><b>§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">>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">>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">>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">>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">§4</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::remove_gl is used in 5/tfg (<a href="5-tfg.html#SP20">§20</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP35"></a><b>§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">"<internal error>"</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">>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">>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"> < </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"> >= 1) {</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">>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">>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">>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">>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"><</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">>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">>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">>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">>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">>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">"<none given>"</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">>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">>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">§20</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP36"></a><b>§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">>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">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">return_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</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">Emit::inv_call_iname</span><span class="plain">(</span><span class="identifier">generic_iname</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val</span><span class="plain">(</span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">an</span><span class="plain">-</span><span class="element">>check_rules</span><span class="plain">-></span><span class="identifier">allocation_id</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::val</span><span class="plain">(</span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">an</span><span class="plain">-</span><span class="element">>carry_out_rules</span><span class="plain">-></span><span class="identifier">allocation_id</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::val</span><span class="plain">(</span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">an</span><span class="plain">-</span><span class="element">>report_rules</span><span class="plain">-></span><span class="identifier">allocation_id</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::up</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>§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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>owned_by_an</span><span class="plain">) &&</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">>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">>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">-></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">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">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">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">switch_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_symbol</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">Emit::code</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::down</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">>use_verb_routine_in_I6_library</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">case_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_iname</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">Emit::code</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::down</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">>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"> <= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">>present_name</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</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="reserved">if</span><span class="plain"> (</span><span class="identifier">j0</span><span class="plain"> >= 0) {</span>
|
|
<<span class="cwebmacro">Insert a space here if needed to break up the action name</span> <span class="cwebmacronumber">37.1</span>><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">>present_name</span><span class="plain">), </span><span class="identifier">AT</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">print_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_text</span><span class="plain">(</span><span class="identifier">AT</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::up</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>
|
|
<<span class="cwebmacro">Insert a space here if needed to break up the action name</span> <span class="cwebmacronumber">37.1</span>><span class="plain">;</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">ifelse_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">eq_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_symbol</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">Emit::val</span><span class="plain">(</span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 2);</span>
|
|
<span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::code</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">print_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"it"</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::code</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::down</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">Emit::up</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::up</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"><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"> >= 0) {</span>
|
|
<<span class="cwebmacro">Insert a space here if needed to break up the action name</span> <span class="cwebmacronumber">37.1</span>><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">>present_name</span><span class="plain">), </span><span class="identifier">AT</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">print_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_text</span><span class="plain">(</span><span class="identifier">AT</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::up</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"> < </span><span class="identifier">an</span><span class="plain">-></span><span class="identifier">max_parameters</span><span class="plain">) {</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">if_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">ne_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_symbol</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">Emit::val</span><span class="plain">(</span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 2);</span>
|
|
<span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::code</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<<span class="cwebmacro">Insert a space here if needed to break up the action name</span> <span class="cwebmacronumber">37.1</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">Emit::up</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::up</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>
|
|
</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>§37.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Insert a space here if needed to break up the action name</span> <span class="cwebmacronumber">37.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clc</span><span class="plain">++ > 0) {</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">print_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::up</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">§37</a> (four times).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP38"></a><b>§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">>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"> > 0) {</span>
|
|
<span class="identifier">K</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">-</span><span class="element">>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">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">indirect1v_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_iname</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">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">plus_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">times_interp</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val</span><span class="plain">(</span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 100);</span>
|
|
<span class="identifier">Emit::val_iname</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">Emit::up</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_iname</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">Emit::up</span><span class="plain">();</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Emit::val_symbol</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">Emit::up</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="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::cat_something2 is used in <a href="#SP37">§37</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::print_action_text_to is used in <a href="#SP37">§37</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::ActionCoding_array appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP39"></a><b>§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">>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">>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">"<b>New actions defined in the source</b>"</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">"<b>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">"</b>"</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">) && (*</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">"<b>"</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">"</b>"</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">>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">"<b>"</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">>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">"</b>"</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">"<b>"</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">>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"> <= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">-</span><span class="element">>present_name</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</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="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"> < </span><span class="identifier">an</span><span class="plain">-></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">>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">"</b>"</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">>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">>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">" (<i>past tense</i> %+W)"</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">-</span><span class="element">>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"> >= 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">"<b>Typed commands leading to this action</b>\</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">>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">"<i>None</i>"</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">>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">"<b>Named values belonging to this action</b>\</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">>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">"<b>Rules controlling this action</b>"</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">>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">, &</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">, &</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">, &</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">, &</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">, &</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">>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">, &</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">>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">, &</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">>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">, &</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">>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">, &</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"> > 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">"&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">>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">-></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">>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">>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">§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>
|
|
|