1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-30 22:14:58 +03:00

Improved stack frame handling

This commit is contained in:
Graham Nelson 2021-04-02 00:47:20 +01:00
parent d23fe29b05
commit a8191a9168
109 changed files with 1760 additions and 1618 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
v10.1.0-alpha.1+6R67 'Krypton' (31 March 2021)
v10.1.0-alpha.1+6R68 'Krypton' (2 April 2021)
## About Inform 7

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 31 March 2021
Build Number: 6R67
Build Date: 2 April 2021
Build Number: 6R68

View file

@ -166,7 +166,7 @@ container (called the sack) is capacious if...".
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">CALLW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Phrases::Phrasal::define_adjective_by_phrase</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">at</span><span class="plain-syntax">, </span><span class="identifier-syntax">body</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">CALLW</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LocalVariables::add_pronoun</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax">), </span><span class="identifier-syntax">CALLW</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LocalVariables::add_pronoun</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">id_stack_frame</span><span class="plain-syntax">), </span><span class="identifier-syntax">CALLW</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -190,7 +190,7 @@ family to give the body its runtime context data.
<span class="reserved-syntax">id_runtime_context_data</span><span class="plain-syntax"> </span><span class="function-syntax">ImperativeDefinitionFamilies::to_phrcd</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">ImperativeDefinitionFamilies::to_phrcd</span></span>:<br/>Imperative Definitions - <a href="5-id.html#SP5_3">&#167;5.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">at</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::make_current</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::make_current</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">id_stack_frame</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">id_runtime_context_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = </span><a href="5-rcd.html#SP1" class="function-link"><span class="function-syntax">RuntimeContextData::new</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family</span><span class="plain-syntax">, </span><span class="constant-syntax">TO_RCD_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::remove_current</span><span class="plain-syntax">();</span>

View file

@ -311,10 +311,10 @@ last possible moment in the booking process.
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">save_cs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">at</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">id_stack_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::make_current</span><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::set_stvol</span><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables_visible_in_definition</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::set_shared_variable_access_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables_visible_in_definition</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">avl</span><span class="plain-syntax"> = </span><a href="5-rcd.html#SP7" class="function-link"><span class="function-syntax">RuntimeContextData::parse_avl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity_context</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">save_cs</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>

View file

@ -86,7 +86,7 @@ and a shared set of variables, so this will not be a long section of code.
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">for_rules</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">after_rules</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">activity_on_what_kind</span><span class="plain-syntax">; </span><span class="comment-syntax"> or null</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">activity_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> activity variables owned here</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">activity_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> activity variables owned here</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">activity_indexing_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">indexing_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">activity_compilation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
@ -168,7 +168,7 @@ special Preform of its own; here is the subject phrase:
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-act.html#SP4_5" class="named-paragraph-link"><span class="named-paragraph">Make proper nouns for the activity name</span><span class="named-paragraph-number">4.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::new_set</span><span class="plain-syntax">(10000+</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::new_set</span><span class="plain-syntax">(10000+</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">before_rules</span><span class="plain-syntax"> = </span><a href="6-act.html#SP6" class="function-link"><span class="function-syntax">Activities::make_rulebook</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">future_action_flag</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">for_rules</span><span class="plain-syntax"> = </span><a href="6-act.html#SP6" class="function-link"><span class="function-syntax">Activities::make_rulebook</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="identifier-syntax">future_action_flag</span><span class="plain-syntax">);</span>
@ -318,7 +318,7 @@ it; actually two &mdash; for example, both "announcing" and "announcing activity
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-act.html#SP8_3" class="named-paragraph-link"><span class="named-paragraph">The specification must be just a kind</span><span class="named-paragraph-number">8.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-act.html#SP8_4" class="named-paragraph-link"><span class="named-paragraph">That kind must be definite</span><span class="named-paragraph-number">8.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::add_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">VW</span><span class="plain-syntax">, </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">VW</span><span class="plain-syntax">, </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8_1" class="paragraph-anchor"></a><b>&#167;8.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">The name of the variable must be fortunate</span><span class="named-paragraph-number">8.1</span></span><span class="comment-syntax"> =</span>

View file

@ -118,8 +118,8 @@ quaint idea of having enumerated ways in which they finish (see <a href="6-fao.h
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">runs_during_activities</span><span class="plain-syntax">; </span><span class="comment-syntax"> allow "while..." clauses to name these</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">used_by_future_action_activity</span><span class="plain-syntax">; </span><span class="comment-syntax"> like "deciding the scope of something..."</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> rulebook variables owned here</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">accessible_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> and which can be named here</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> rulebook variables owned here</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">accessible_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> and which can be named here</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rulebook_compilation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rulebook_indexing_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">indexing_data</span><span class="plain-syntax">;</span>
@ -151,9 +151,9 @@ quaint idea of having enumerated ways in which they finish (see <a href="6-fao.h
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-rlb.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Work out the focus and outcome</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::new_set</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::new_access_list</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::add_set_to_access_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::new_set</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::new_access_list</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::add_set_to_access_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTRules::new_rulebook_compilation_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">indexing_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IXRules::new_rulebook_indexing_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">);</span>
@ -474,7 +474,7 @@ has a D called W":
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-rlb.html#SP10_5" class="named-paragraph-link"><span class="named-paragraph">In fact, its description has to be a kind</span><span class="named-paragraph-number">10.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-rlb.html#SP10_6" class="named-paragraph-link"><span class="named-paragraph">And a definite one at that</span><span class="named-paragraph-number">10.6</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::add_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10_1" class="paragraph-anchor"></a><b>&#167;10.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">The variable has to have a name</span><span class="named-paragraph-number">10.1</span></span><span class="comment-syntax"> =</span>
@ -596,8 +596,8 @@ go into <span class="extract"><span class="extract-syntax">B-&gt;my_variables</s
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::grant_access_to_variables</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::grant_access_to_variables</span></span>:<br/>Activities - <a href="6-act.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="identifier-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::add_set_to_access_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rulebooks::grant_access_to_variables</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::grant_access_to_variables</span></span>:<br/>Activities - <a href="6-act.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::add_set_to_access_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">accessible_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Attaching and detaching rules. </b>The following routine contains a bit of a surprise: that the act of

View file

@ -109,7 +109,7 @@ different dynamics altogether. In short, then: rules are not phrases.
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_of_rule_set_from</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">defn_as_I7_source</span><span class="plain-syntax">; </span><span class="comment-syntax"> if defined by an I7 id_body</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">variables_visible_in_definition</span><span class="plain-syntax">; </span><span class="comment-syntax"> if so</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">variables_visible_in_definition</span><span class="plain-syntax">; </span><span class="comment-syntax"> if so</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">defn_as_Inter_function</span><span class="plain-syntax">; </span><span class="comment-syntax"> if not</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">booking</span><span class="plain-syntax"> *</span><span class="identifier-syntax">automatic_booking</span><span class="plain-syntax">; </span><span class="comment-syntax"> how this is placed in rulebooks</span>
@ -158,7 +158,7 @@ rule called <span class="extract"><span class="extract-syntax">W</span></span>,
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_of_rule_set_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defn_as_I7_source</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables_visible_in_definition</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::new_access_list</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables_visible_in_definition</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::new_access_list</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defn_as_Inter_function</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">automatic_booking</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
@ -326,14 +326,14 @@ nothing.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defn_as_I7_source</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>Inside such a definition, certain stacked variables may be in scope. For
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>Inside such a definition, certain shared variables may be in scope. For
example, if a rule is in an activity rulebook, then it will be able to see
the variables belonging to that activity.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rules::put_variables_in_scope</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Rules::put_variables_in_scope</span></span>:<br/>Rulebooks - <a href="6-rlb.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::append_access_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables_visible_in_definition</span><span class="plain-syntax">, </span><span class="identifier-syntax">access</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rules::put_variables_in_scope</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Rules::put_variables_in_scope</span></span>:<br/>Rulebooks - <a href="6-rlb.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::append_access_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables_visible_in_definition</span><span class="plain-syntax">, </span><span class="identifier-syntax">access</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rules::put_action_variables_in_scope</span><span class="plain-syntax">(</span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
@ -344,13 +344,13 @@ the variables belonging to that activity.
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">all_action_processing_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">all_action_processing_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="function-syntax">Rules::all_action_processing_variables</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="function-syntax">Rules::all_action_processing_variables</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">all_action_processing_vars</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">all_action_processing_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::new_access_list</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">all_action_processing_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::new_access_list</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax"> = </span><a href="6-rlb.html#SP19" class="function-link"><span class="function-syntax">Rulebooks::std</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ACTION_PROCESSING_RB</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax">) </span><span class="identifier-syntax">StackedVariables::add_set_to_access_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">all_action_processing_vars</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax">) </span><span class="identifier-syntax">SharedVariables::add_set_to_access_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">all_action_processing_vars</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">all_action_processing_vars</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>

View file

@ -448,14 +448,14 @@ whether it is able to do this or not.
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">INT_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">GENERATE_IN_SUPPORT_FUNCTION_ADJM_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">adjective_meaning_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">f</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">adjective_meaning</span><span class="plain-syntax"> *</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">emit_flag</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">adjective_meaning</span><span class="plain-syntax"> *</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">emit_flag</span><span class="plain-syntax">, </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. </b>This dual behaviour means there are two function calls invoking it:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">AdjectiveMeanings::generate_in_support_function</span><span class="plain-syntax">(</span><span class="reserved-syntax">adjective_meaning</span><span class="plain-syntax"> *</span><span class="identifier-syntax">am</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><a href="8-am.html#SP13" class="function-link"><span class="function-syntax">AdjectiveMeanings::nscg_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">am</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">has_been_compiled_in_support_function</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax">;</span>
@ -466,7 +466,7 @@ whether it is able to do this or not.
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">AdjectiveMeanings::nscg_inner</span><span class="plain-syntax">(</span><span class="reserved-syntax">adjective_meaning</span><span class="plain-syntax"> *</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">emit_flag</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="8-am.html#SP11" class="function-link"><span class="function-syntax">AdjectiveMeanings::prepare_schemas</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="8-am.html#SP13_1" class="named-paragraph-link"><span class="named-paragraph">Use the I6 schema instead to compile the task, if one exists</span><span class="named-paragraph-number">13.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>

View file

@ -200,9 +200,9 @@ We begin with <a href="index.html" class="internal">core</a> itself.
<span class="definition-keyword">enum</span> <span class="constant-syntax">property_setting_bp_data_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">relation_inference_data_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">short_name_notice_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">stacked_variable_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">stacked_variable_set_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">stacked_variable_access_list_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">shared_variable_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">shared_variable_set_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">shared_variable_access_list_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">value_property_data_CLASS</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
@ -221,9 +221,9 @@ We begin with <a href="index.html" class="internal">core</a> itself.
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">property_setting_bp_data</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">relation_inference_data</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">short_name_notice</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS_ALLOCATED_IN_ARRAYS</span><span class="plain-syntax">(</span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax">, </span><span class="constant-syntax">100</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS_ALLOCATED_IN_ARRAYS</span><span class="plain-syntax">(</span><span class="identifier-syntax">stacked_variable_set</span><span class="plain-syntax">, </span><span class="constant-syntax">100</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS_ALLOCATED_IN_ARRAYS</span><span class="plain-syntax">(</span><span class="identifier-syntax">stacked_variable_access_list</span><span class="plain-syntax">, </span><span class="constant-syntax">100</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS_ALLOCATED_IN_ARRAYS</span><span class="plain-syntax">(</span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax">, </span><span class="constant-syntax">100</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS_ALLOCATED_IN_ARRAYS</span><span class="plain-syntax">(</span><span class="identifier-syntax">shared_variable_set</span><span class="plain-syntax">, </span><span class="constant-syntax">100</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS_ALLOCATED_IN_ARRAYS</span><span class="plain-syntax">(</span><span class="identifier-syntax">shared_variable_access_list</span><span class="plain-syntax">, </span><span class="constant-syntax">100</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">value_property_data</span><span class="plain-syntax">)</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b><a href="../imperative-module/index.html" class="internal">imperative</a> &mdash;
@ -234,8 +234,8 @@ We begin with <a href="index.html" class="internal">core</a> itself.
<span class="definition-keyword">enum</span> <span class="constant-syntax">past_tense_action_record_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">past_tense_condition_record_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">pcalc_prop_deferral_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">ph_stack_frame_box_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">pointer_allocation_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">stack_frame_box_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">local_block_value_CLASS</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">DECLARE_CLASS_ALLOCATED_IN_ARRAYS</span><span class="plain-syntax">(</span><span class="identifier-syntax">invocation_options</span><span class="plain-syntax">, </span><span class="constant-syntax">100</span><span class="plain-syntax">)</span>
@ -243,8 +243,8 @@ We begin with <a href="index.html" class="internal">core</a> itself.
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">past_tense_action_record</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">past_tense_condition_record</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop_deferral</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph_stack_frame_box</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">pointer_allocation</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">stack_frame_box</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">local_block_value</span><span class="plain-syntax">)</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b><a href="../runtime-module/index.html" class="internal">runtime</a> &mdash;
</p>

View file

@ -633,7 +633,7 @@ the going action variables.
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">DIVERT_AP_CLAUSE_PLUG</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PluginCalls::divert_AP_clause_ID</span><span class="plain-syntax">(</span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PluginCalls::divert_AP_clause_ID</span><span class="plain-syntax">(</span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">id</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PLUGINS_CALL</span><span class="plain-syntax">(</span><span class="constant-syntax">DIVERT_AP_CLAUSE_PLUG</span><span class="plain-syntax">, </span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

View file

@ -91,7 +91,7 @@ kind <span class="extract"><span class="extract-syntax">K_action_name</span></sp
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">check_rules</span><span class="plain-syntax">; </span><span class="comment-syntax"> rulebooks private to this action</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">carry_out_rules</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">report_rules</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">cg_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">command_parser_grammar_producing_this</span><span class="plain-syntax">; </span><span class="comment-syntax"> if any</span>
@ -130,7 +130,7 @@ which had not actually been done since around 2008.
<span class="plain-syntax"> </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">carry_out_rules</span><span class="plain-syntax"> = </span><a href="4-act.html#SP3" class="function-link"><span class="function-syntax">Actions::new_rulebook</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">, </span><span class="identifier-syntax">CARRY_OUT_RB_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">report_rules</span><span class="plain-syntax"> = </span><a href="4-act.html#SP3" class="function-link"><span class="function-syntax">Actions::new_rulebook</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">, </span><span class="identifier-syntax">REPORT_RB_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_variables</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::new_set</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTActions::action_variable_set_ID</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::new_set</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTActions::action_variable_set_ID</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">ACTION_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Created action: %W\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">an</span><span class="plain-syntax">;</span>

View file

@ -449,7 +449,7 @@ in the final AP.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">clause_ID</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">clause_text</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">anl_clause</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_clause</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv_to_match</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv_to_match</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">evaluation</span><span class="plain-syntax">;</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">anl_clause</span><span class="plain-syntax">;</span>
</pre>
@ -524,7 +524,7 @@ in the final AP.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">anl_entry</span><span class="plain-syntax"> *</span><span class="function-syntax">ActionNameLists::set_clause_wording_and_stv</span><button class="popup" onclick="togglePopup('usagePopup29')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup29">Usage of <span class="code-font"><span class="function-syntax">ActionNameLists::set_clause_wording_and_stv</span></span>:<br/><a href="4-anl.html#SP25">&#167;25</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">anl_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">entry</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">entry</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no entry"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">anl_clause</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prev</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_ANL_CLAUSES</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">, </span><span class="identifier-syntax">entry</span><span class="plain-syntax">) {</span>
@ -1218,10 +1218,10 @@ are divergence points:
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">Word::unexpectedly_upper_case</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">Wordings::first_wn</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">)) == </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">action_name</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">chief_an</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">currently_exploding_entry</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-element-syntax">item</span><span class="Preform-plain-syntax">.</span><span class="Preform-element-syntax">action_listed</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">chief_an</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">stacked_variable_set</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">stvo</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">chief_an</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-element-syntax">action_variables</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">shared_variable_set</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">stvo</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">chief_an</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-element-syntax">action_variables</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">stvo</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">stacked_variable</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">stv</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">stv</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">stacked_variable</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">stvo</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-identifier-syntax">list_of_stvs</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">shared_variable</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">stv</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">stv</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">shared_variable</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">stvo</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-identifier-syntax">variables</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">wording</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">VW</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">stv</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-identifier-syntax">match_wording_text</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">Wordings::starts_with</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">VW</span><span class="Preform-plain-syntax">)) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">wording</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">T</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">Wordings::from</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">Wordings::first_wn</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">) + </span><span class="Preform-identifier-syntax">Wordings::length</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">VW</span><span class="Preform-plain-syntax">));</span>
@ -1258,7 +1258,7 @@ clauses anyway, this will never be too bad.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ActionNameLists::detonate</span><button class="popup" onclick="togglePopup('usagePopup46')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup46">Usage of <span class="code-font"><span class="function-syntax">ActionNameLists::detonate</span></span>:<br/><a href="4-anl.html#SP38_1">&#167;38.1</a>, <a href="4-anl.html#SP38_2">&#167;38.2</a>, <a href="4-anl.html#SP39">&#167;39</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">potential_C</span><span class="plain-syntax">, </span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ActionNameLists::detonate</span><button class="popup" onclick="togglePopup('usagePopup46')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup46">Usage of <span class="code-font"><span class="function-syntax">ActionNameLists::detonate</span></span>:<br/><a href="4-anl.html#SP38_1">&#167;38.1</a>, <a href="4-anl.html#SP38_2">&#167;38.2</a>, <a href="4-anl.html#SP39">&#167;39</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">potential_C</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-anl.html#SP16" class="function-link"><span class="function-syntax">ActionNameLists::has_clause</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">currently_exploding_entry</span><span class="plain-syntax">, </span><span class="identifier-syntax">potential_C</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">anl_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">extra</span><span class="plain-syntax"> = </span><a href="4-anl.html#SP25" class="function-link"><span class="function-syntax">ActionNameLists::duplicate_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">currently_exploding_entry</span><span class="plain-syntax">);</span>

View file

@ -201,7 +201,7 @@ of the text they came from; for which, see <a href="4-pap.html" class="internal"
<span class="plain-syntax"> </span><span class="reserved-syntax">action_pattern</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ap</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="4-pap.html#SP2" class="function-link"><span class="function-syntax">ParseActionPatterns::enter_mode</span></a><span class="plain-syntax">(</span><span class="constant-syntax">PERMIT_TRYING_OMISSION</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Rules::all_action_processing_variables</span><span class="plain-syntax">())</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::set_stvol</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::set_shared_variable_access_list</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Rules::all_action_processing_variables</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;action-pattern&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="identifier-syntax">ap</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::remove_nonphrase_stack_frame</span><span class="plain-syntax">();</span>

View file

@ -113,15 +113,15 @@ action variable clauses.
<span class="definition-keyword">enum</span> <span class="constant-syntax">TAIL_AP_CLAUSE</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">APClauses::clause_ID_for_action_variable</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">APClauses::clause_ID_for_action_variable</span></span>:<br/><a href="4-apc.html#SP13">&#167;13</a><br/>Action Name Lists - <a href="4-anl.html#SP39">&#167;39</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">APClauses::clause_ID_for_action_variable</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">APClauses::clause_ID_for_action_variable</span></span>:<br/><a href="4-apc.html#SP13">&#167;13</a><br/>Action Name Lists - <a href="4-anl.html#SP39">&#167;39</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginCalls::divert_AP_clause_ID</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">D</span><span class="plain-syntax">); </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">D</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">oid</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::get_owner_id</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">off</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">oid</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::get_owner_id</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">off</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">1000</span><span class="plain-syntax">*</span><span class="identifier-syntax">oid</span><span class="plain-syntax"> + </span><span class="identifier-syntax">off</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">APClauses::write_clause_ID</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">APClauses::write_clause_ID</span></span>:<br/><a href="4-apc.html#SP10">&#167;10</a><br/>Action Name Lists - <a href="4-anl.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">APClauses::write_clause_ID</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">APClauses::write_clause_ID</span></span>:<br/><a href="4-apc.html#SP10">&#167;10</a><br/>Action Name Lists - <a href="4-anl.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">C</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PARAMETRIC_AP_CLAUSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"parameter"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ACTOR_AP_CLAUSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"actor"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
@ -135,7 +135,7 @@ action variable clauses.
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginCalls::write_AP_clause_ID</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"{"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NonlocalVariables::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">StackedVariables::get_variable</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NonlocalVariables::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">SharedVariables::get_variable</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"}"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
@ -146,7 +146,7 @@ action variable clauses.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ap_clause</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">clause_ID</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv_to_match</span><span class="plain-syntax">; </span><span class="comment-syntax"> can be </span><span class="extract"><span class="extract-syntax">NULL</span></span><span class="comment-syntax"> for some built-in clause IDs</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv_to_match</span><span class="plain-syntax">; </span><span class="comment-syntax"> can be </span><span class="extract"><span class="extract-syntax">NULL</span></span><span class="comment-syntax"> for some built-in clause IDs</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">clause_spec</span><span class="plain-syntax">; </span><span class="comment-syntax"> what the pattern says about this value</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">clause_options</span><span class="plain-syntax">; </span><span class="comment-syntax"> a bitmap of flags: see below</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ap_clause</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next</span><span class="plain-syntax">; </span><span class="comment-syntax"> in the linked list of clauses for an action pattern</span>
@ -348,9 +348,9 @@ variables:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">APClauses::set_action_variable_spec</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">APClauses::set_action_variable_spec</span></span>:<br/>Parse Clauses - <a href="4-pc.html#SP1_4">&#167;1.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">action_pattern</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">APClauses::set_action_variable_spec</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">APClauses::set_action_variable_spec</span></span>:<br/>Parse Clauses - <a href="4-pc.html#SP1_4">&#167;1.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">action_pattern</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no stacked variable for apoc"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no shared variable for apoc"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax"> = </span><a href="4-apc.html#SP1" class="function-link"><span class="function-syntax">APClauses::clause_ID_for_action_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ap_clause</span><span class="plain-syntax"> *</span><span class="identifier-syntax">apoc</span><span class="plain-syntax"> = </span><a href="4-apc.html#SP5" class="function-link"><span class="function-syntax">APClauses::ensure_clause</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">apoc</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">stv_to_match</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stv</span><span class="plain-syntax">;</span>
@ -388,8 +388,8 @@ variables:
<span class="plain-syntax"> </span><span class="reserved-syntax">ap_clause</span><span class="plain-syntax"> *</span><span class="identifier-syntax">apoc1</span><span class="plain-syntax"> = </span><a href="4-apc.html#SP13" class="function-link"><span class="function-syntax">APClauses::advance_to_next_av_clause</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ap1</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap_clauses</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">apoc2</span><span class="plain-syntax"> = </span><a href="4-apc.html#SP13" class="function-link"><span class="function-syntax">APClauses::advance_to_next_av_clause</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ap2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap_clauses</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">apoc1</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">apoc2</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">off1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">apoc1</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stv_to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">off2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">apoc2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stv_to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">off1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">apoc1</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stv_to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">off2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">apoc2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stv_to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">off1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">off2</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::compare_specificity</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">apoc1</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">clause_spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">apoc2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">clause_spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>

View file

@ -265,21 +265,21 @@ variables (hence "nonempty") &mdash; many will not, in practice:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">all_nonempty_stacked_action_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">all_nonempty_stacked_action_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ActionVariables::new</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">ActionVariables::new</span></span>:<br/><a href="4-av.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">action_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">an</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">NW</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">MW</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">all_nonempty_stacked_action_vars</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">all_nonempty_stacked_action_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::new_access_list</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">StackedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_variables</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::add_set_to_access_list</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">all_nonempty_stacked_action_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::new_access_list</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">SharedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_variables</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::add_set_to_access_list</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">all_nonempty_stacked_action_vars</span><span class="plain-syntax">, </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::add_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">NW</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">NW</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">MW</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::set_matching_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="identifier-syntax">MW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::set_matching_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="identifier-syntax">MW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">ACTION_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Created action variable for $l: %W (%u)\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">an</span><span class="plain-syntax">, </span><span class="identifier-syntax">NW</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">MW</span><span class="plain-syntax">))</span>
@ -298,8 +298,8 @@ action patterns. For example, the Standard Rules define:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">ActionVariables::parse_match_clause</span><span class="plain-syntax">(</span><span class="reserved-syntax">action_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">an</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::parse_match_clause</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">ActionVariables::parse_match_clause</span><span class="plain-syntax">(</span><span class="reserved-syntax">action_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">an</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::parse_match_clause</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">action_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">

View file

@ -173,9 +173,9 @@ a special ID number of our choice.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">GoingPlugin::divert_clause_ID</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">GoingPlugin::divert_clause_ID</span></span>:<br/><a href="4-gng.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">oid</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::get_owner_id</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">off</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">GoingPlugin::divert_clause_ID</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">GoingPlugin::divert_clause_ID</span></span>:<br/><a href="4-gng.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">oid</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::get_owner_id</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">off</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">going_action</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">oid</span><span class="plain-syntax"> == </span><a href="4-gng.html#SP4" class="function-link"><span class="function-syntax">GoingPlugin::id</span></a><span class="plain-syntax">())) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">off</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">: *</span><span class="identifier-syntax">id</span><span class="plain-syntax"> = </span><span class="constant-syntax">GOING_FROM_AP_CLAUSE</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>

View file

@ -565,10 +565,10 @@ to enable Inform to set up a stack frame if there isn't one already, and so on.
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;ap-five-condition&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">ph_stack_frame</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">phsf</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">stack_frame</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">phsf</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">Frames::current_stack_frame</span><span class="Preform-plain-syntax">() == </span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">) </span><span class="Preform-identifier-syntax">phsf</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">Frames::new_nonphrasal</span><span class="Preform-plain-syntax">();</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">StackedVariables::append_access_list</span><span class="Preform-plain-syntax">(</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">Frames::get_stvol</span><span class="Preform-plain-syntax">(), </span><span class="Preform-identifier-syntax">all_nonempty_stacked_action_vars</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">SharedVariables::append_access_list</span><span class="Preform-plain-syntax">(</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">Frames::get_shared_variable_access_list</span><span class="Preform-plain-syntax">(), </span><span class="Preform-identifier-syntax">all_nonempty_stacked_action_vars</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">LOGIF</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">ACTION_PATTERN_PARSING</span><span class="Preform-plain-syntax">, </span><span class="Preform-string-syntax">"A when clause &lt;%W&gt; is suspected.\n"</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">parse_node</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">when_cond</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">int</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">s</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">pap_failure_reason</span><span class="Preform-plain-syntax">;</span>

View file

@ -289,7 +289,7 @@ to typecheck each clause.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">check</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::get_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stv_to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">check</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::get_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stv_to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">evaluation</span><span class="plain-syntax">, </span><span class="identifier-syntax">UNKNOWN_NT</span><span class="plain-syntax">)) </span><span class="identifier-syntax">fail</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>

View file

@ -453,7 +453,7 @@ ever tampered with.
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new_s</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP10" class="function-link"><span class="function-syntax">LocalVariables::add_internal_local_as_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"new"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">trips_s</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP10" class="function-link"><span class="function-syntax">LocalVariables::add_internal_local_as_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"trips"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">consecutives_s</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP10" class="function-link"><span class="function-syntax">LocalVariables::add_internal_local_as_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"consecutives"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP11" class="function-link"><span class="function-syntax">Frames::determines_the_past</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP10" class="function-link"><span class="function-syntax">Frames::determines_the_past</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>

View file

@ -189,7 +189,7 @@ are most conveniently stored as locals, not globals.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::blank_slate</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::blank_slate</span></span>:<br/>Stack Frames - <a href="2-sf.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::blank_slate</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::blank_slate</span></span>:<br/>Stack Frames - <a href="2-sf.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> </span><span class="identifier-syntax">slate</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">slate</span><span class="plain-syntax">.</span><span class="identifier-syntax">local_variable_allocation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">local_variable</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">slate</span><span class="plain-syntax">.</span><span class="identifier-syntax">it_pseudonym</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
@ -202,7 +202,7 @@ context of compilation for later use. That includes locals, so:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::deep_copy_locals_slate</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::deep_copy_locals_slate</span></span>:<br/>Stack Frames - <a href="2-sf.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">slate_to</span><span class="plain-syntax">, </span><span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">slate_from</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::deep_copy_locals_slate</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::deep_copy_locals_slate</span></span>:<br/>Stack Frames - <a href="2-sf.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">slate_to</span><span class="plain-syntax">, </span><span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">slate_from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">slate_to</span><span class="plain-syntax"> = *</span><span class="identifier-syntax">slate_from</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">slate_to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_variable_allocation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">local_variable</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
@ -302,7 +302,7 @@ they compile to the I6 names <span class="extract"><span class="extract-syntax">
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_call_parameter</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::add_call_parameter</span></span>:<br/><a href="2-lv.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_call_parameter</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::add_call_parameter</span></span>:<br/><a href="2-lv.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP6" class="function-link"><span class="function-syntax">LocalVariables::add_to_locals_slate</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="constant-syntax">TOKEN_CALL_PARAMETER_LV</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, -1);</span>
@ -310,7 +310,7 @@ they compile to the I6 names <span class="extract"><span class="extract-syntax">
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_call_parameter_as_symbol</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_call_parameter_as_symbol</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">v</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP7" class="function-link"><span class="function-syntax">LocalVariables::add_call_parameter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-lv.html#SP46" class="function-link"><span class="function-syntax">LocalVariables::declare_this</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">8</span><span class="plain-syntax">);</span>
@ -332,7 +332,7 @@ currently being compiled:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::new</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::new</span></span>:<br/><a href="2-lv.html#SP32_3">&#167;32.3</a><br/>Deciding to Defer - <a href="3-dtd.html#SP23">&#167;23</a>, <a href="3-dtd.html#SP27">&#167;27</a><br/>Compile Invocations Inline - <a href="4-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="4-cii.html#SP3_5_1_1">&#167;3.5.1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to add let value without stack frame"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP6" class="function-link"><span class="function-syntax">LocalVariables::add_to_locals_slate</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="constant-syntax">LET_VALUE_LV</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, -1);</span>
@ -356,7 +356,7 @@ scratch work-space which can be used in the compiled code.
<span class="plain-syntax">}</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_internal_local</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::add_internal_local</span></span>:<br/>Compile Invocations Inline - <a href="4-cii.html#SP3_5_1_2">&#167;3.5.1.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-lv.html#SP10" class="function-link"><span class="function-syntax">LocalVariables::add_internal</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">), </span><span class="identifier-syntax">name</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">INTERNAL_USE_LV</span><span class="plain-syntax">);</span>
@ -375,14 +375,14 @@ scratch work-space which can be used in the compiled code.
<span class="plain-syntax">}</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_named_call</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::add_named_call</span></span>:<br/><a href="2-lv.html#SP46">&#167;46</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-lv.html#SP10" class="function-link"><span class="function-syntax">LocalVariables::add_internal</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">), </span><span class="identifier-syntax">name</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">OTHER_CALL_PARAMETER_LV</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_named_call_as_symbol</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::add_named_call_as_symbol</span></span>:<br/>Stacked Variables - <a href="2-sv.html#SP3">&#167;3</a><br/>Chronology - <a href="2-chr.html#SP6">&#167;6</a><br/>Cinders and Deferrals - <a href="3-cad.html#SP5">&#167;5</a><br/>Compile Deferred Propositions - <a href="3-cdp.html#SP2_1_5">&#167;2.1.5</a>, <a href="3-cdp.html#SP2_1_5_2">&#167;2.1.5.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_named_call_as_symbol</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::add_named_call_as_symbol</span></span>:<br/>Chronology - <a href="2-chr.html#SP6">&#167;6</a><br/>Cinders and Deferrals - <a href="3-cad.html#SP5">&#167;5</a><br/>Compile Deferred Propositions - <a href="3-cdp.html#SP2_1_5">&#167;2.1.5</a>, <a href="3-cdp.html#SP2_1_5_2">&#167;2.1.5.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">v</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP10" class="function-link"><span class="function-syntax">LocalVariables::add_named_call</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-lv.html#SP46" class="function-link"><span class="function-syntax">LocalVariables::declare_this</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">8</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -394,7 +394,7 @@ scratch work-space which can be used in the compiled code.
<span class="plain-syntax">}</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_internal_local_c</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::add_internal_local_c</span></span>:<br/><a href="2-lv.html#SP11">&#167;11</a>, <a href="2-lv.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">comment</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-lv.html#SP10" class="function-link"><span class="function-syntax">LocalVariables::add_internal</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">),</span>
@ -441,7 +441,7 @@ passed to its I6 routine, and this occupies a pseudo-call-parameter:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::options_parameter_is_needed</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::options_parameter_is_needed</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-lv.html#SP10" class="function-link"><span class="function-syntax">LocalVariables::add_internal</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"phrase_options"</span><span class="plain-syntax">, </span><span class="constant-syntax">OTHER_CALL_PARAMETER_LV</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -465,7 +465,7 @@ a loop counter disappearing when its loop body is finished.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::deallocate_all</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::deallocate_all</span></span>:<br/>Compile Phrases - <a href="4-cp.html#SP2_2">&#167;2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::deallocate_all</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::deallocate_all</span></span>:<br/>Compile Phrases - <a href="4-cp.html#SP2_2">&#167;2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_LOCALS_IN_FRAME</span><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">lv_purpose</span><span class="plain-syntax"> == </span><span class="constant-syntax">LET_VALUE_LV</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allocated</span><span class="plain-syntax">))</span>
@ -475,7 +475,7 @@ a loop counter disappearing when its loop body is finished.
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>&#167;16. Extent. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::count</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::count</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ct</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
@ -496,7 +496,7 @@ given fresh names in between now and then.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::copy</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf_to</span><span class="plain-syntax">, </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf_from</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::copy</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf_to</span><span class="plain-syntax">, </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf_from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">slate_from</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">phsf_from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">slate_to</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">phsf_to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">);</span>
@ -512,7 +512,7 @@ given fresh names in between now and then.
<span class="plain-syntax"> </span><span class="identifier-syntax">slate_to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">its_form_allowed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">slate_from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">its_form_allowed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">slate_to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">it_pseudonym</span><span class="plain-syntax"> = </span><span class="identifier-syntax">slate_from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">it_pseudonym</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf_to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_stvol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phsf_from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_stvol</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf_to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">shared_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phsf_from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">shared_variables</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>&#167;18. Searching. </b>One way is to search the slate for a scratch variable by its I6 name:
@ -541,19 +541,19 @@ given fresh names in between now and then.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::by_name</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::by_name</span></span>:<br/>Compile Invocations Inline - <a href="4-cii.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-lv.html#SP18" class="function-link"><span class="function-syntax">LocalVariables::find_i6_var</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">), </span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="constant-syntax">INTERNAL_USE_LV</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::by_name_any</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-lv.html#SP18" class="function-link"><span class="function-syntax">LocalVariables::find_any</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">), </span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::phrase_options</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-lv.html#SP18" class="function-link"><span class="function-syntax">LocalVariables::find_i6_var</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"phrase_options"</span><span class="plain-syntax">, </span><span class="constant-syntax">OTHER_CALL_PARAMETER_LV</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -562,7 +562,7 @@ given fresh names in between now and then.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::find_pcalc_var</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">v</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">slate</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">);</span>
@ -574,7 +574,7 @@ given fresh names in between now and then.
<span class="plain-syntax">}</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::find_const_var</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::find_const_var</span></span>:<br/>Cinders and Deferrals - <a href="3-cad.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">v</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="string-syntax">"const_%d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">v</span><span class="plain-syntax">);</span>
@ -592,7 +592,7 @@ given fresh names in between now and then.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::are_we_using_table_lookup</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::are_we_using_table_lookup</span></span>:<br/>Chronology - <a href="2-chr.html#SP5">&#167;5</a>, <a href="2-chr.html#SP6_4">&#167;6.4</a><br/>Compile Deferred Propositions - <a href="3-cdp.html#SP2_1_3">&#167;2.1.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-lv.html#SP18" class="function-link"><span class="function-syntax">LocalVariables::find_i6_var</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"ct_0"</span><span class="plain-syntax">, </span><span class="constant-syntax">INTERNAL_USE_LV</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -605,7 +605,7 @@ there isn't one.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::get_ith_parameter</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::get_ith_parameter</span></span>:<br/><a href="2-lv.html#SP25">&#167;25</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no stack frame exists"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
@ -630,14 +630,14 @@ very fast.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::parse</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::parse</span></span>:<br/><a href="2-lv.html#SP32">&#167;32</a><br/>Compile Invocations Inline - <a href="4-cii.html#SP5_1">&#167;5.1</a>, <a href="4-cii.html#SP6">&#167;6</a><br/>Compile Solutions to Equations - <a href="4-cste.html#SP3_3">&#167;3.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::parse</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::parse</span></span>:<br/><a href="2-lv.html#SP32">&#167;32</a><br/>Compile Invocations Inline - <a href="4-cii.html#SP5_1">&#167;5.1</a>, <a href="4-cii.html#SP6">&#167;6</a><br/>Compile Solutions to Equations - <a href="4-cste.html#SP3_3">&#167;3.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP23" class="function-link"><span class="function-syntax">LocalVariables::parse_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) </span><span class="identifier-syntax">lvar</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parsed_recently</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::parse_inner</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::parse_inner</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">.</span><span class="element-syntax">it_variable_exists</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;agent-pronoun&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pronoun_usage</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pu</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">;</span>
@ -682,7 +682,7 @@ any need.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">stack_selection_used_recently</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::monitor_local_parsing</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::monitor_local_parsing</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_LOCALS_IN_FRAME</span><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>
@ -695,7 +695,7 @@ any need.
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_selection_used_recently</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::local_parsed_recently</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::local_parsed_recently</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_LOCALS_IN_FRAME</span><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>
@ -714,7 +714,7 @@ fake up a call parameter pro tem.)
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::it_variable</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::it_variable</span></span>:<br/><a href="2-lv.html#SP23">&#167;23</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-lv.html#SP22" class="function-link"><span class="function-syntax">LocalVariables::get_ith_parameter</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-lv.html#SP6" class="function-link"><span class="function-syntax">LocalVariables::add_to_locals_slate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="constant-syntax">TOKEN_CALL_PARAMETER_LV</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
@ -725,29 +725,29 @@ fake up a call parameter pro tem.)
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::is_possessive_form_of_it_enabled</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">.</span><span class="element-syntax">its_form_allowed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::enable_possessive_form_of_it</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no stack frame exists"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_value_variables</span><span class="plain-syntax">.</span><span class="element-syntax">its_form_allowed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_pronoun</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_pronoun</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_value_variables</span><span class="plain-syntax">.</span><span class="element-syntax">it_variable_exists</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-lv.html#SP7" class="function-link"><span class="function-syntax">LocalVariables::add_call_parameter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_pronoun_as_symbol</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::add_pronoun_as_symbol</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_value_variables</span><span class="plain-syntax">.</span><span class="element-syntax">it_variable_exists</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">v</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP7" class="function-link"><span class="function-syntax">LocalVariables::add_call_parameter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-lv.html#SP46" class="function-link"><span class="function-syntax">LocalVariables::declare_this</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">8</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::alias_pronoun</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::alias_pronoun</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_value_variables</span><span class="plain-syntax">.</span><span class="element-syntax">it_pseudonym</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -758,14 +758,14 @@ park the values of the locals into a little scratch array before the call...
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::compile_storage</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::compile_storage</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">j</span><span class="plain-syntax">=0;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_LOCALS_IN_FRAME</span><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"(LocalParking--&gt;%d=%~L),"</span><span class="plain-syntax">, </span><span class="identifier-syntax">j</span><span class="plain-syntax">++, </span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::emit_storage</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::emit_storage</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">NC</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">j</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
@ -792,7 +792,7 @@ function, i.e., immediately after the call.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::compile_retrieval</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::compile_retrieval</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">LP</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">LOCALPARKING_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">j</span><span class="plain-syntax">=0;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
@ -814,7 +814,7 @@ function, i.e., immediately after the call.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::make_available_to_equation</span><span class="plain-syntax">(</span><span class="identifier-syntax">equation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eqn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_LOCALS_IN_FRAME</span><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>
@ -829,7 +829,7 @@ the text "X":
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::ensure_called_local</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::ensure_called_local</span></span>:<br/><a href="2-lv.html#SP31">&#167;31</a><br/>Deciding to Defer - <a href="3-dtd.html#SP8_2">&#167;8.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> in case callings are made from parsing alone</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;new-called-name&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">;</span>
@ -884,7 +884,7 @@ name or a description.
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-lv.html#SP32_3" class="named-paragraph-link"><span class="named-paragraph">Make a new local for this calling</span><span class="named-paragraph-number">32.3</span></a></span>
<span class="Preform-function-syntax">&lt;existing-local-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">local_variable</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">lvar</span><span class="Preform-plain-syntax"> = </span><a href="2-lv.html#SP23" class="function-link"><span class="Preform-function-syntax">LocalVariables::parse</span></a><span class="Preform-plain-syntax">(</span><a href="2-sf.html#SP7" class="function-link"><span class="Preform-function-syntax">Frames::current_stack_frame</span></a><span class="Preform-plain-syntax">(), </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">local_variable</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">lvar</span><span class="Preform-plain-syntax"> = </span><a href="2-lv.html#SP23" class="function-link"><span class="Preform-function-syntax">LocalVariables::parse</span></a><span class="Preform-plain-syntax">(</span><a href="2-sf.html#SP2" class="function-link"><span class="Preform-function-syntax">Frames::current_stack_frame</span></a><span class="Preform-plain-syntax">(), </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">lvar</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> ==&gt; { -, </span><span class="Preform-identifier-syntax">lvar</span><span class="Preform-plain-syntax"> };</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">TRUE</span><span class="Preform-plain-syntax">;</span>
@ -933,7 +933,7 @@ name or a description.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> ==&gt; { </span><span class="constant-syntax">0</span><span class="plain-syntax">, (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)?(</span><a href="2-lv.html#SP9" class="function-link"><span class="function-syntax">LocalVariables::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">)):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax"> };</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-lv.html#SP32">&#167;32</a>.</li></ul>
@ -996,7 +996,7 @@ an instance of the kind "bystander".
<p class="commentary firstcommentary"><a id="SP34" class="paragraph-anchor"></a><b>&#167;34. Logging. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::log</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::log</span></span>:<br/>Imperative Module - <a href="1-im.html#SP2">&#167;2</a><br/>Stack Frames - <a href="2-sf.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::log</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::log</span></span>:<br/>Imperative Module - <a href="1-im.html#SP2">&#167;2</a><br/>Stack Frames - <a href="2-sf.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-lv.html#SP34" class="function-link"><span class="function-syntax">LocalVariables::write</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -1098,7 +1098,7 @@ and when the block ends it decrements.
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::end_scope</span><button class="popup" onclick="togglePopup('usagePopup34')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup34">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::end_scope</span></span>:<br/>Phrase Blocks - <a href="2-pb.html#SP12">&#167;12</a>, <a href="2-pb.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">s</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"relinquishing locals where no stack frame exists"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">s</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"the outermost scope cannot end"</span><span class="plain-syntax">);</span>
@ -1127,7 +1127,7 @@ right result, so don't use it for anything else.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::latest_repeat_variable</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">s</span><span class="plain-syntax"> = </span><a href="2-pb.html#SP15" class="function-link"><span class="function-syntax">Frames::Blocks::current_block_level</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
@ -1241,7 +1241,7 @@ parameters:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::compile_parameter_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_vars</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::compile_parameter_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_vars</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">purpose</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">purpose</span><span class="plain-syntax"> = </span><span class="constant-syntax">TOKEN_CALL_PARAMETER_LV</span><span class="plain-syntax">; </span><span class="identifier-syntax">purpose</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">OTHER_CALL_PARAMETER_LV</span><span class="plain-syntax">; </span><span class="identifier-syntax">purpose</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
@ -1253,7 +1253,7 @@ parameters:
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::emit_parameter_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::emit_parameter_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">purpose</span><span class="plain-syntax"> = </span><span class="constant-syntax">TOKEN_CALL_PARAMETER_LV</span><span class="plain-syntax">; </span><span class="identifier-syntax">purpose</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">OTHER_CALL_PARAMETER_LV</span><span class="plain-syntax">; </span><span class="identifier-syntax">purpose</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_LOCALS_IN_FRAME</span><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>
@ -1266,7 +1266,7 @@ parameters:
<p class="commentary firstcommentary"><a id="SP45" class="paragraph-anchor"></a><b>&#167;45. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::deduced_function_kind</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::deduced_function_kind</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_LOCALS_IN_FRAME</span><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>
@ -1289,7 +1289,7 @@ need in the compilation of any given routine:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::declare</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">shell_mode</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LocalVariables::declare</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">shell_mode</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">purpose</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax"> = </span><span class="constant-syntax">TOKEN_CALL_PARAMETER_LV</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax"> = </span><span class="constant-syntax">INTERNAL_USE_LV</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">shell_mode</span><span class="plain-syntax">) </span><span class="identifier-syntax">to</span><span class="plain-syntax"> = </span><span class="constant-syntax">OTHER_CALL_PARAMETER_LV</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">)</span>

View file

@ -166,7 +166,7 @@ begins:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::Blocks::begin_code_blocks</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">() == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">() == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to use blocks outside stack frame"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">block_being_compiled</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to begin block stack already in use"</span><span class="plain-syntax">);</span>
@ -359,7 +359,7 @@ So we do this by hand, jumping to a label placed just after the loop ends.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::Blocks::set_variable_scope</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Frames::Blocks::set_variable_scope</span></span>:<br/>Compile Invocations Inline - <a href="4-cii.html#SP1_2_1">&#167;1.2.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">())</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">())</span>
<span class="plain-syntax"> </span><a href="2-lv.html#SP39" class="function-link"><span class="function-syntax">LocalVariables::set_scope_to</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_block_stack</span><span class="plain-syntax">.</span><span class="element-syntax">pb_sp</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -371,7 +371,7 @@ phrase:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::Blocks::set_scope_to_block_about_to_open</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Frames::Blocks::set_scope_to_block_about_to_open</span></span>:<br/>Deciding to Defer - <a href="3-dtd.html#SP23">&#167;23</a>, <a href="3-dtd.html#SP27">&#167;27</a><br/>Compile Invocations Inline - <a href="4-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="4-cii.html#SP3_5_1_1">&#167;3.5.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">())</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">())</span>
<span class="plain-syntax"> </span><a href="2-lv.html#SP39" class="function-link"><span class="function-syntax">LocalVariables::set_scope_to</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_block_stack</span><span class="plain-syntax">.</span><span class="element-syntax">pb_sp</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

View file

@ -70,219 +70,391 @@ function togglePopup(material_id) {
<!--Weave of 'Stack Frames' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">imperative</a></li><li><a href="index.html#2">Chapter 2: Compilation Context</a></li><li><b>Stack Frames</b></li></ul></div>
<p class="purpose">When Inform compiles phrase invocations, or implied forms of these such as text substitutions, it does so in the context of a "stack frame". This provides for local "let" values, manages loop blocks, and in general looks after any information shared between a whole sequence of invocations.</p>
<p class="purpose">When Inform compiles imperative code, it does so in the context of a "stack frame".</p>
<ul class="toc"><li><a href="2-sf.html#SP4">&#167;4. Creation</a></li><li><a href="2-sf.html#SP7">&#167;7. The current stack frame</a></li><li><a href="2-sf.html#SP8">&#167;8. Kinds</a></li><li><a href="2-sf.html#SP10">&#167;10. Stacked variables</a></li><li><a href="2-sf.html#SP11">&#167;11. Past tense</a></li><li><a href="2-sf.html#SP12">&#167;12. Logging</a></li><li><a href="2-sf.html#SP13">&#167;13. Formal parameter allocation</a></li><li><a href="2-sf.html#SP14">&#167;14. Pointer value allocation</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="2-sf.html#SP1">&#167;1. Introduction</a></li><li><a href="2-sf.html#SP6">&#167;6. Creation</a></li><li><a href="2-sf.html#SP7">&#167;7. Kinds</a></li><li><a href="2-sf.html#SP9">&#167;9. Shared variables</a></li><li><a href="2-sf.html#SP10">&#167;10. Past tense</a></li><li><a href="2-sf.html#SP11">&#167;11. Formal parameters</a></li><li><a href="2-sf.html#SP12">&#167;12. Local block values</a></li><li><a href="2-sf.html#SP18">&#167;18. Logging</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>As we've seen, each phrase has its own stack frame, which is a structure
inside the <span class="extract"><span class="extract-syntax">phrase</span></span> structure. But they can also exist independently, for
other occasions when compilation occurs. They keep track of which variables
are visible, and also of the current values of the kind variables A to Z,
if any, and the consequent return kind.
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Introduction. </b>The term "stack frame" is traditional in computer science. The idea is that
there is a stack holding temporary data needed by the functions currently
running. Each function, as it begins, claims a "frame" of memory on the stack,
thus pushing the stack higher; when it ends, the memory in that frame is
given up. It can thus be used only for temporary data.
</p>
<p class="commentary">Our object code, Inter, is designed for use with virtual machines on which the
call stack is not directly addressable, so the term "stack frame" here is used
a little loosely. What we mean is: the collection of everything that is distinctive
about the function currently being compiled. In particular:
</p>
<ul class="items"><li>&#9679; its local variables;
</li><li>&#9679; what shared variables it can see;
</li><li>&#9679; what interpretations to place on the kind variables <span class="extract"><span class="extract-syntax">A</span></span> to <span class="extract"><span class="extract-syntax">Z</span></span>, if any;
</li><li>&#9679; what kind of value we should be returning, if anything.
</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Code can only be compiled "inside" a stack frame, and at any given time
(when code is being comoiled, anyway) there is a "current" frame.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> {</span>
<span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::current_stack_frame</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Frames::current_stack_frame</span></span>:<br/><a href="2-sf.html#SP7">&#167;7</a>, <a href="2-sf.html#SP8">&#167;8</a>, <a href="2-sf.html#SP9">&#167;9</a>, <a href="2-sf.html#SP10">&#167;10</a>, <a href="2-sf.html#SP11">&#167;11</a>, <a href="2-sf.html#SP12">&#167;12</a><br/>Local Variables - <a href="2-lv.html#SP9">&#167;9</a>, <a href="2-lv.html#SP10">&#167;10</a>, <a href="2-lv.html#SP19">&#167;19</a>, <a href="2-lv.html#SP20">&#167;20</a>, <a href="2-lv.html#SP21">&#167;21</a>, <a href="2-lv.html#SP22">&#167;22</a>, <a href="2-lv.html#SP25">&#167;25</a>, <a href="2-lv.html#SP26">&#167;26</a>, <a href="2-lv.html#SP29">&#167;29</a>, <a href="2-lv.html#SP30">&#167;30</a>, <a href="2-lv.html#SP32">&#167;32</a>, <a href="2-lv.html#SP32_3">&#167;32.3</a>, <a href="2-lv.html#SP40">&#167;40</a>, <a href="2-lv.html#SP41">&#167;41</a><br/>Phrase Blocks - <a href="2-pb.html#SP7">&#167;7</a>, <a href="2-pb.html#SP17">&#167;17</a>, <a href="2-pb.html#SP18">&#167;18</a><br/>Compile Solutions to Equations - <a href="4-cste.html#SP3_3">&#167;3.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">current_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>This must be imposed and removed manually:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::make_current</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Frames::make_current</span></span>:<br/><a href="2-sf.html#SP4">&#167;4</a><br/>Compile Phrases - <a href="4-cp.html#SP2_2">&#167;2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"can't select null stack frame"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::remove_current</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Frames::remove_current</span></span>:<br/><a href="2-sf.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>There are three ways to get stack frames. First, every phrase or rule has
one of its own. Second, though, we will also need a stack frame in order to
compile the many functions which aren't directly corresponding to phrases or
rules at all. Such a frame is called "nonphrasal":
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame_is_current</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::new_nonphrasal</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nonphrasal_stack_frame_is_current</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"can't nest nonphrasal stack frames"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP6" class="function-link"><span class="function-syntax">Frames::new</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame_is_current</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP3" class="function-link"><span class="function-syntax">Frames::make_current</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> &amp;</span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::remove_nonphrase_stack_frame</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP6" class="function-link"><span class="function-syntax">Frames::new</span></a><span class="plain-syntax">(); </span><span class="comment-syntax"> to prevent accidental lucky misuse</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame_is_current</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP3" class="function-link"><span class="function-syntax">Frames::remove_current</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b><a href="2-sf.html#SP6" class="internal">stack_frame</a> is a small and potentially throwaway structure, and can
sometimes exist only fleetingly in the compiler. If we want to preserve it,
or take a snapshot of its current state, we need to make a "boxed" copy, and
this is the third sort of stack frame which exists.
</p>
<p class="commentary">The following does so. <a href="2-sf.html#SP5" class="internal">stack_frame_box</a> objects provide a convenient permanent
place in memory to stash these; pointers to them otherwise don't exist.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame_box</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">boxed_phsf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">stack_frame_box</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::boxed_frame</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">old_frame</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">old_frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame_box</span><span class="plain-syntax"> *</span><span class="identifier-syntax">box</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame_box</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new_frame</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">box</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">boxed_phsf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">new_frame</span><span class="plain-syntax"> = *</span><span class="identifier-syntax">old_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-lv.html#SP5" class="function-link"><span class="function-syntax">LocalVariables::deep_copy_locals_slate</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">new_frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">old_frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">new_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure stack_frame_box is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Creation. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> </span><span class="identifier-syntax">local_value_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> those in scope here</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">local_stvol</span><span class="plain-syntax">; </span><span class="comment-syntax"> those in scope here</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">allocated_pointers</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shared_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> those in scope here</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">local_block_values</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">local_block_value</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_formal_parameters_needed</span><span class="plain-syntax">; </span><span class="comment-syntax"> usually 0, unless there are ambiguities</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_returned</span><span class="plain-syntax">; </span><span class="comment-syntax"> or </span><span class="extract"><span class="extract-syntax">NULL</span></span><span class="comment-syntax"> for no return value</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">local_kind_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> points to an array indexed 1 to 26</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">determines_past_conditions</span><span class="plain-syntax">; </span><span class="comment-syntax"> or rather, in the present, but for future use</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::new</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Frames::new</span></span>:<br/><a href="2-sf.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">.</span><span class="identifier-syntax">local_value_variables</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP4" class="function-link"><span class="function-syntax">LocalVariables::blank_slate</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">.</span><span class="identifier-syntax">local_kind_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">.</span><span class="identifier-syntax">shared_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">.</span><span class="identifier-syntax">determines_past_conditions</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">.</span><span class="identifier-syntax">local_block_values</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">.</span><span class="identifier-syntax">kind_returned</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">.</span><span class="identifier-syntax">no_formal_parameters_needed</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure ph_stack_frame is accessed in 2/lv and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Stack frames are often made fleetingly and then thrown away, but sometimes
we need to make one and keep it around. For this, we have the ability to box
up a stack frame: by allocating an instance of the following structure, we
can have a permanently valid pointer to a unique new PHSF.
<ul class="endnotetexts"><li>The structure stack_frame is accessed in 2/lv and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Kinds. </b>The kind of value we expect to return from within this stack frame, if any.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame_box</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">boxed_phsf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">ph_stack_frame_box</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure ph_stack_frame_box is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>Within each stack frame is a linked list of notes about pointer values
for which memory allocation and deallocation will be needed:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">heap_allocation</span><span class="plain-syntax"> </span><span class="identifier-syntax">allocation</span><span class="plain-syntax">; </span><span class="comment-syntax"> needed to compile a function call returning a pointer to a new value</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">local_reference_code</span><span class="plain-syntax">; </span><span class="comment-syntax"> an I6 lvalue for the storage holding the pointer</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">escaped_local_reference_code</span><span class="plain-syntax">; </span><span class="comment-syntax"> the same, but suitable for schema use</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">schema_for_promotion</span><span class="plain-syntax">; </span><span class="comment-syntax"> an I6 schema for promoting this value</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">offset_index</span><span class="plain-syntax">; </span><span class="comment-syntax"> start of small block wrt current stack frame</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">offset_past</span><span class="plain-syntax">; </span><span class="comment-syntax"> just past the end of the small block</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_in_frame</span><span class="plain-syntax">; </span><span class="comment-syntax"> within the linked list</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure pointer_allocation is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Creation. </b>A completely black stack frame...
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::new</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Frames::new</span></span>:<br/><a href="2-sf.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP4" class="function-link"><span class="function-syntax">LocalVariables::blank_slate</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">local_kind_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">local_stvol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">determines_past_conditions</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">allocated_pointers</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">kind_returned</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">no_formal_parameters_needed</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>...can be useful all by itself. The following is used to make a temporary
stack frame suitable for "nonphrasal" compilation, that is, for when Inform
wants to compile an I6 routine for some purpose other than to define a phrase.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame_is_current</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::new_nonphrasal</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nonphrasal_stack_frame_is_current</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"can't nest nonphrasal stack frames"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP4" class="function-link"><span class="function-syntax">Frames::new</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame_is_current</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::make_current</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> &amp;</span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::remove_nonphrase_stack_frame</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP4" class="function-link"><span class="function-syntax">Frames::new</span></a><span class="plain-syntax">(); </span><span class="comment-syntax"> to prevent accidental lucky misuse</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame_is_current</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::remove_current</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>Another way to get hold of a PHSF is to request a boxed one, as noted above:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::boxed_frame</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame_box</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsfb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsfb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame_box</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsfb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">boxed_phsf</span><span class="plain-syntax"> = *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-lv.html#SP5" class="function-link"><span class="function-syntax">LocalVariables::deep_copy_locals_slate</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phsfb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">boxed_phsf</span><span class="plain-syntax">.</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">phsfb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">boxed_phsf</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. The current stack frame. </b>At any given time, a single stack frame is valid for local variable names
and phrase option names used as conditions. It will be the nonphrasal one
if that's active, and otherwise must be set as needed.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::current_stack_frame</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Frames::current_stack_frame</span></span>:<br/><a href="2-sf.html#SP8">&#167;8</a>, <a href="2-sf.html#SP9">&#167;9</a>, <a href="2-sf.html#SP10">&#167;10</a>, <a href="2-sf.html#SP11">&#167;11</a>, <a href="2-sf.html#SP13">&#167;13</a>, <a href="2-sf.html#SP14">&#167;14</a><br/>Local Variables - <a href="2-lv.html#SP9">&#167;9</a>, <a href="2-lv.html#SP10">&#167;10</a>, <a href="2-lv.html#SP19">&#167;19</a>, <a href="2-lv.html#SP20">&#167;20</a>, <a href="2-lv.html#SP21">&#167;21</a>, <a href="2-lv.html#SP22">&#167;22</a>, <a href="2-lv.html#SP25">&#167;25</a>, <a href="2-lv.html#SP26">&#167;26</a>, <a href="2-lv.html#SP29">&#167;29</a>, <a href="2-lv.html#SP30">&#167;30</a>, <a href="2-lv.html#SP32">&#167;32</a>, <a href="2-lv.html#SP32_3">&#167;32.3</a>, <a href="2-lv.html#SP40">&#167;40</a>, <a href="2-lv.html#SP41">&#167;41</a><br/>Phrase Blocks - <a href="2-pb.html#SP7">&#167;7</a>, <a href="2-pb.html#SP17">&#167;17</a>, <a href="2-pb.html#SP18">&#167;18</a><br/>Compile Solutions to Equations - <a href="4-cste.html#SP3_3">&#167;3.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">current_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::make_current</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Frames::make_current</span></span>:<br/><a href="2-sf.html#SP5">&#167;5</a><br/>Compile Phrases - <a href="4-cp.html#SP2_2">&#167;2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"can't select null stack frame"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::remove_current</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Frames::remove_current</span></span>:<br/><a href="2-sf.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Kinds. </b>The kind of value we expect to return from within this stack frame, if any.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::set_kind_returned</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">kind_returned</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::set_kind_returned</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">kind_returned</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::get_kind_returned</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Frames::get_kind_returned</span></span>:<br/>Compile Invocations Inline - <a href="4-cii.html#SP3_1_1_4_7_1">&#167;3.1.1.4.7.1</a>, <a href="4-cii.html#SP7">&#167;7</a><br/>Compile Phrases - <a href="4-cp.html#SP2_3_1">&#167;2.3.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_returned</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_returned</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>And the values of the kind variables A to Z:
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>And the values of the kind variables A to Z:
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">KIND_VARIABLE_FROM_CONTEXT</span><span class="plain-syntax"> </span><a href="2-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::get_kind_variable</span></a>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">KIND_VARIABLE_FROM_CONTEXT</span><span class="plain-syntax"> </span><a href="2-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::get_kind_variable</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::set_kind_variables</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Frames::set_kind_variables</span></span>:<br/>Compile Phrases - <a href="4-cp.html#SP2_2">&#167;2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">vars</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_kind_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">vars</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::set_kind_variables</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Frames::set_kind_variables</span></span>:<br/>Compile Phrases - <a href="4-cp.html#SP2_2">&#167;2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">vars</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_kind_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">vars</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::get_kind_variable</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Frames::get_kind_variable</span></span>:<br/>Compile Invocations Inline - <a href="4-cii.html#SP3_1_1_1">&#167;3.1.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_kind_variables</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_kind_variables</span><span class="plain-syntax">[</span><span class="identifier-syntax">N</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">frame</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_kind_variables</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_kind_variables</span><span class="plain-syntax">[</span><span class="identifier-syntax">N</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="function-syntax">Frames::temporarily_set_kvs</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Frames::temporarily_set_kvs</span></span>:<br/>Compile Invocations Inline - <a href="4-cii.html#SP3_1_1">&#167;3.1.1</a>, <a href="4-cii.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">vars</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">prev</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_kind_variables</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_kind_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">vars</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">prev</span><span class="plain-syntax"> = </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_kind_variables</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_kind_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">vars</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">prev</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Stacked variables. </b></p>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Shared variables. </b>See <a href="2-sv.html" class="internal">Shared Variables</a> for more on this.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::set_stvol</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Frames::set_stvol</span></span>:<br/>Compile Phrases - <a href="4-cp.html#SP2_2">&#167;2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stvol</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_stvol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stvol</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::set_shared_variable_access_list</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Frames::set_shared_variable_access_list</span></span>:<br/>Compile Phrases - <a href="4-cp.html#SP2_2">&#167;2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">shared_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">access</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::get_stvol</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_stvol</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::get_shared_variable_access_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">shared_variables</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Past tense. </b>All we do here is to make a note if anything compiled in this context makes
reference to the past.
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Past tense. </b>It turns out to be convenient to remember whether the current function makes
any reference to the past, which we do here:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::determines_the_past</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Frames::determines_the_past</span></span>:<br/>Chronology - <a href="2-chr.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"tried to determine past where no stack frame exists"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">determines_past_conditions</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">determines_past_conditions</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">LOCAL_VARIABLES</span><span class="plain-syntax">, </span><span class="string-syntax">"Stack frame determines past\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::used_for_past_tense</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Frames::used_for_past_tense</span></span>:<br/>Compile Atoms - <a href="3-ca.html#SP3_1_2">&#167;3.1.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">determines_past_conditions</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">determines_past_conditions</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Logging. </b></p>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Formal parameters. </b>Some stack frames need access to additional Inter function parameters to handle
runtime invocation ambiguities, and this is how they're requested:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::log</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;null stack frame&gt;\n"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::need_at_least_this_many_formals</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Frames::need_at_least_this_many_formals</span></span>:<br/>Compile Invocations - <a href="4-ci.html#SP2_2">&#167;2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"requested formal parameters outside all stack frames"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_formal_parameters_needed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_formal_parameters_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Local block values. </b>Simple data at runtime, such as values of <span class="extract"><span class="extract-syntax">K_number</span></span> or <span class="extract"><span class="extract-syntax">K_truth_state</span></span>, occupy
a single Inter word. More involved data, such as values of <span class="extract"><span class="extract-syntax">K_text</span></span> or
<span class="extract"><span class="extract-syntax">K_stored_action</span></span>, cannot. Those are called "block values", because they occupy
entire multiple-word blocks of memory to store.
</p>
<p class="commentary">So when such data must be stored in a local variable, or some other memory location,
we will store the data itself if the kind is sufficiently simple, but a pointer
to an appropriate block of memory if not.
</p>
<p class="commentary">This is a particular issue for functions whose local variables need to have
block-value kinds, because that means the function must allocate suitable memory
when called and deallocate it on exit. Each stack frame must therefore track
what local block values it will need:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">local_block_value</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::allocate_local_block_value</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Frames::allocate_local_block_value</span></span>:<br/><a href="2-sf.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to allocate block kind outside all stack frames"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax"> *</span><span class="identifier-syntax">last</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LAST_IN_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_block_values</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bv</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::new_lbv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">last</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">bv</span><span class="plain-syntax">, </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_block_values</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::uses_local_block_values</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">frame</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_block_values</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. </b>Where should temporary block values live, during the perhaps very brief
period while a function is running? We can't put it onto the virtual machine's
call stack, because it doesn't live in the VM's memory at all, and therefore
cannot be written or read. We could put it on the heap, but then allocation
and deallocation would be expensive.
</p>
<p class="commentary">Instead we put just the small blocks on a stack in memory: it fills downwards,
and at runtime the Inter identifier <span class="extract"><span class="extract-syntax">I7SFRAME</span></span> points to the current and therefore
bottom-most frame on this stack. So, for example, if the current stack frame has
just two local block values, a <span class="extract"><span class="extract-syntax">K_text</span></span> and a <span class="extract"><span class="extract-syntax">K_stored_action</span></span>, then we would have:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> ...free space...</span>
<span class="plain-syntax"> I7SFRAME --&gt; 0 } small block 0 (for a K_text), offset index 0</span>
<span class="plain-syntax"> 1 } may then --&gt; more data on the heap offset past 2</span>
<span class="plain-syntax"> 2 } small block 1 (for a K_stored_action) offset index 2</span>
<span class="plain-syntax"> 3 } similarly --&gt; more data on the heap offset past 8</span>
<span class="plain-syntax"> 4 }</span>
<span class="plain-syntax"> 5 }</span>
<span class="plain-syntax"> 6 }</span>
<span class="plain-syntax"> 7 }</span>
<span class="plain-syntax"> ...frames belonging to functions calling this one...</span>
</pre>
<p class="commentary">These small blocks may well point to larger blocks elsewhere on the heap (for
example, to accommodate the actual contents of a text, if they are non-constant).
But small blocks have the virtue of being of a size which is fixed for each
kind, and we can allocate space for them essentially immediately just by raising
the <span class="extract"><span class="extract-syntax">I7SFRAME</span></span> sufficiently.
</p>
<p class="commentary">Each local block value is kept track of with one of these:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">heap_allocation</span><span class="plain-syntax"> </span><span class="identifier-syntax">allocation</span><span class="plain-syntax">; </span><span class="comment-syntax"> needed to compile a function call returning a pointer to a new value</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to_refer</span><span class="plain-syntax">; </span><span class="comment-syntax"> a schema to access this data</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">offset_index</span><span class="plain-syntax">; </span><span class="comment-syntax"> start of small block wrt current stack frame</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">offset_past</span><span class="plain-syntax">; </span><span class="comment-syntax"> just past the end of the small block</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure local_block_value is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. </b>Note that the schemas below for calculating offset positions from <span class="extract"><span class="extract-syntax">I7SFRAME</span></span>
will end up only as a single addition at runtime, because the multiplication of
<span class="extract"><span class="extract-syntax">WORDSIZE</span></span> by a literal positive integer will be constant-folded in code
generation.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">local_block_value</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::new_lbv</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Frames::new_lbv</span></span>:<br/><a href="2-sf.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax"> *</span><span class="identifier-syntax">last</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">last</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">bv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax"> = </span><span class="identifier-syntax">last</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_past</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allocation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTKinds::make_heap_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">bv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_past</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax"> + </span><span class="identifier-syntax">Kinds::Behaviour::get_small_block_size</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">ref</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">ref</span><span class="plain-syntax">, </span><span class="string-syntax">"I7SFRAME"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">ref</span><span class="plain-syntax">, </span><span class="string-syntax">"(I7SFRAME+WORDSIZE)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">ref</span><span class="plain-syntax">, </span><span class="string-syntax">"(I7SFRAME+WORDSIZE**%d)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">bv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">to_refer</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">ref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">ref</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. </b>The following code is executed when the stack frame is entered: we push the
old value of <span class="extract"><span class="extract-syntax">I7SFRAME_HL</span></span> to the call stack to save it; then call a function
in <a href="../BasicInformKit/S-blc.html" class="internal">BlockValues (in BasicInformKit)</a> to make space for the small
blocks we need, which will move <span class="extract"><span class="extract-syntax">I7SFRAME_HL</span></span> downwards by <span class="extract"><span class="extract-syntax">size</span></span> words; and
then initialise the small blocks one by one to default values.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::compile_lbv_setup</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::push</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">I7SFRAME_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lbv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">lbv</span><span class="plain-syntax">, </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_block_values</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lbv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_past</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">size</span><span class="plain-syntax">) </span><span class="identifier-syntax">size</span><span class="plain-syntax"> = </span><span class="identifier-syntax">lbv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_past</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">STACKFRAMECREATE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">size</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">lbv</span><span class="plain-syntax">, </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_block_values</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTKinds::emit_heap_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">lbv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allocation</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>&#167;16. </b>Symmetrically, this teardown code is executed when the stack frame is exited.
We deallocate each small block, and then restore <span class="extract"><span class="extract-syntax">I7SFRAME_HL</span></span> by pulling the
value we pushed earlier.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::compile_lbv_teardown</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lbv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">lbv</span><span class="plain-syntax">, </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_block_values</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">BLKVALUEFREEONSTACK_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">lbv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::pull</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">I7SFRAME_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>&#167;17. </b>The net effect is that when the rest of Inform needs to compile the address
of a newly-allocated value of a block kind <span class="extract"><span class="extract-syntax">K</span></span>, it can simply call the
following, without having to worry about how any of this works:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::emit_new_local_value</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Frames::emit_new_local_value</span></span>:<br/>Compiling from Specifications - <a href="3-cfs.html#SP6">&#167;6</a><br/>Deciding to Defer - <a href="3-dtd.html#SP15">&#167;15</a>, <a href="3-dtd.html#SP16">&#167;16</a><br/>Compile Invocations As Calls - <a href="4-ciac.html#SP2_1">&#167;2.1</a><br/>Compile Invocations Inline - <a href="4-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="4-cii.html#SP3_2_1">&#167;3.2.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bv</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP12" class="function-link"><span class="function-syntax">Frames::allocate_local_block_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-efs.html#SP1" class="function-link"><span class="function-syntax">EmitSchemas::emit_expand_from_terms</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">to_refer</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>&#167;18. Logging. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::log</span><span class="plain-syntax">(</span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;null stack frame&gt;\n"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Stack frame at %08x: it:%s, dpc:%s\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">.</span><span class="element-syntax">it_variable_exists</span><span class="plain-syntax">)?</span><span class="string-syntax">"yes"</span><span class="plain-syntax">:</span><span class="string-syntax">"no"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">determines_past_conditions</span><span class="plain-syntax">)?</span><span class="string-syntax">"yes"</span><span class="plain-syntax">:</span><span class="string-syntax">"no"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">.</span><span class="element-syntax">it_variable_exists</span><span class="plain-syntax">)?</span><span class="string-syntax">"yes"</span><span class="plain-syntax">:</span><span class="string-syntax">"no"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">determines_past_conditions</span><span class="plain-syntax">)?</span><span class="string-syntax">"yes"</span><span class="plain-syntax">:</span><span class="string-syntax">"no"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_LOCALS_IN_FRAME</span><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_LOCALS_IN_FRAME</span><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">frame</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">lv_purpose</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LET_VALUE_LV:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Let/loop value: "</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TOKEN_CALL_PARAMETER_LV:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Call value: "</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
@ -294,120 +466,6 @@ reference to the past.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Formal parameter allocation. </b>Some stack frames need access to additional variables to handle run-time
invocation ambiguities, and this is how they're requested:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::need_at_least_this_many_formals</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Frames::need_at_least_this_many_formals</span></span>:<br/>Compile Invocations - <a href="4-ci.html#SP2_2">&#167;2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"requested formal parameters outside all stack frames"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_formal_parameters_needed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_formal_parameters_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. Pointer value allocation. </b>Values such as lists, which have to stored in whole blocks rather than single
words of memory, are sometimes called pointer values because all we can
immediately handle is a pointer to the block. When these arise in the
compilation of a routine, we have to make a note of this, because special
code will be needed to allocate and deallocate the memory storing the block.
The following is the routine called to make this note.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::add_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">proto</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Tried to allocate: %u\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to allocate block kind outside all stack frames"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_in_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allocated_pointers</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocated_pointers</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pall</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_in_frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_in_frame</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_past</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">offset_past</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax"> + </span><span class="identifier-syntax">Kinds::Behaviour::get_small_block_size</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-sf.html#SP14_1" class="named-paragraph-link"><span class="named-paragraph">Work out heap allocation code for this pointer value</span><span class="named-paragraph-number">14.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-sf.html#SP14_2" class="named-paragraph-link"><span class="named-paragraph">Work out local reference code for this pointer value</span><span class="named-paragraph-number">14.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-sf.html#SP14_3" class="named-paragraph-link"><span class="named-paragraph">Work out promotion schema for this pointer value</span><span class="named-paragraph-number">14.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::compile_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::add_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><a href="2-sf.html#SP15" class="function-link"><span class="function-syntax">Frames::pall_get_local_reference</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::emit_allocation</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Frames::emit_allocation</span></span>:<br/>Compiling from Specifications - <a href="3-cfs.html#SP6">&#167;6</a><br/>Deciding to Defer - <a href="3-dtd.html#SP15">&#167;15</a>, <a href="3-dtd.html#SP16">&#167;16</a><br/>Compile Invocations As Calls - <a href="4-ciac.html#SP2_1">&#167;2.1</a><br/>Compile Invocations Inline - <a href="4-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="4-cii.html#SP3_2_1">&#167;3.2.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::add_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">all_sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">escaped_local_reference_code</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-efs.html#SP1" class="function-link"><span class="function-syntax">EmitSchemas::emit_expand_from_terms</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">all_sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP14_1" class="paragraph-anchor"></a><b>&#167;14.1. </b>The following works out a call to <span class="extract"><span class="extract-syntax">BlkValueCreate</span></span> which will return a
default value of the given kind.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Work out heap allocation code for this pointer value</span><span class="named-paragraph-number">14.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTKinds::make_heap_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-sf.html#SP14">&#167;14</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP14_2" class="paragraph-anchor"></a><b>&#167;14.2. </b>This is the storage used to hold the pointer. For each frame, we have
a subarray of short blocks, indexed by the offset.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Work out local reference code for this pointer value</span><span class="named-paragraph-number">14.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_reference_code</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">escaped_local_reference_code</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"I7SFRAME"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">escaped_local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"I7SFRAME"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"(I7SFRAME+WORDSIZE)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">escaped_local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"(I7SFRAME+WORDSIZE)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"(I7SFRAME+WORDSIZE*%d)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">escaped_local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"(I7SFRAME+WORDSIZE**%d)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_index</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-sf.html#SP14">&#167;14</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP14_3" class="paragraph-anchor"></a><b>&#167;14.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Work out promotion schema for this pointer value</span><span class="named-paragraph-number">14.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">schema_for_promotion</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">proto</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">proto</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">proto</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] == </span><span class="character-syntax">'*'</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">proto</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">+1] == </span><span class="character-syntax">'#'</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">proto</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">+2] == </span><span class="character-syntax">'#'</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">schema_for_promotion</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">escaped_local_reference_code</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">+=2;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">schema_for_promotion</span><span class="plain-syntax">, </span><span class="identifier-syntax">proto</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-sf.html#SP14">&#167;14</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::pall_get_local_reference</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Frames::pall_get_local_reference</span></span>:<br/><a href="2-sf.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">local_reference_code</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::pall_get_expanded_schema</span><span class="plain-syntax">(</span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">schema_for_promotion</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-pb.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-lv.html">lv</a></li><li class="progresssection"><a href="2-sv.html">sv</a></li><li class="progresssection"><a href="2-pb.html">pb</a></li><li class="progresscurrent">sf</li><li class="progresssection"><a href="2-chr.html">chr</a></li><li class="progresschapter"><a href="3-cfs.html">3</a></li><li class="progresschapter"><a href="4-inv.html">4</a></li><li class="progressnext"><a href="2-chr.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -1,7 +1,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Stacked Variables</title>
<title>Shared Variables</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
@ -67,268 +67,236 @@ function togglePopup(material_id) {
</ul>
</nav>
<main role="main">
<!--Weave of 'Stacked Variables' generated by Inweb-->
<!--Weave of 'Shared Variables' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">imperative</a></li><li><a href="index.html#2">Chapter 2: Compilation Context</a></li><li><b>Stacked Variables</b></li></ul></div>
<p class="purpose">To permit variables to have scopes intermediate between local and global: for example, to be shared by all rules in a given rulebook.</p>
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">imperative</a></li><li><a href="index.html#2">Chapter 2: Compilation Context</a></li><li><b>Shared Variables</b></li></ul></div>
<p class="purpose">Shared variables are held in common by all rules in a given rulebook.</p>
<ul class="toc"><li><a href="2-sv.html#SP1">&#167;1. Definitions</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="2-sv.html#SP1">&#167;1. Introduction</a></li><li><a href="2-sv.html#SP2">&#167;2. Variables</a></li><li><a href="2-sv.html#SP6">&#167;6. Sets</a></li><li><a href="2-sv.html#SP9">&#167;9. Access lists</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Definitions. </b></p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Introduction. </b>Inform allows some variables to be shared by a number of different rules
(with different stack frames) and yet not be global in scope or permanent
in existence: they are shared by some process carried out by rulebooks.
</p>
<p class="commentary">The semantics of shared variables are unusual because rules can be
in multiple rulebooks, or can be moved out of their expected rulebooks.
Their names are therefore not limited in scope &mdash; they are global, and
they belong to the same namespace as global variables. But access to them
is restricted to just those rules with permission.
</p>
<p class="commentary">Each <a href="2-sv.html#SP2" class="internal">shared_variable</a> belongs to just one <a href="2-sv.html#SP6" class="internal">shared_variable_set</a>, but the
code forming the body of a rule may be able to access multiple sets. So
each stack frame has its own <a href="2-sv.html#SP9" class="internal">shared_variable_access_list</a> of those sets
which it can see.
</p>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Variables. </b>As can be seen, a shared variable is really just some additional expectations
placed on a global variable:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> {</span>
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owner</span><span class="plain-syntax">; </span><span class="comment-syntax"> who owns this</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax">; </span><span class="comment-syntax"> text of the name</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">assigned_at</span><span class="plain-syntax">; </span><span class="comment-syntax"> sentence assigning it</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">underlying_var</span><span class="plain-syntax">; </span><span class="comment-syntax"> the variable in question</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">owner_id</span><span class="plain-syntax">; </span><span class="comment-syntax"> who owns this</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">offset_in_owning_frame</span><span class="plain-syntax">; </span><span class="comment-syntax"> word offset of storage (counts from 0)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">match_wording_text</span><span class="plain-syntax">; </span><span class="comment-syntax"> matching text (relevant for action variables only)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_stvs</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">recognition_id</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">list_of_stvs</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">stacked_variable</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">creator_fn_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sets</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">stacked_variable_set</span></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax">;</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure stacked_variable is accessed in 4/cii, 4/cste and here.</li><li>The structure stacked_variable_set is private to this section.</li><li>The structure stacked_variable_access_list is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<ul class="endnotetexts"><li>The structure shared_variable is accessed in 4/cii, 4/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>And it can only be created within a set:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">max_frame_size_needed</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::new</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Articles::remove_the</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax"> = </span><span class="identifier-syntax">set</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_in_owning_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">assigned_at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NonlocalVariables::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">shv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">underlying_var</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTVariables::set_I6_identifier</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">RTVariables::shv_rvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTVariables::set_I6_identifier</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="identifier-syntax">RTVariables::shv_lvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-sv.html#SP6" class="function-link"><span class="function-syntax">SharedVariables::add_to_set</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b></p>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>Some miscellaneous access functions:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">StackedVariables::get_owner_id</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner_id</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::get_owner_id</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">recognition_id</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">StackedVariables::get_offset</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_in_owning_frame</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::get_offset</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_in_owning_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">StackedVariables::get_kind</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::get_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::get_kind</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP4" class="function-link"><span class="function-syntax">SharedVariables::get_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NonlocalVariables::kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">StackedVariables::get_variable</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">StackedVariables::get_variable</span></span>:<br/><a href="2-sv.html#SP3_1">&#167;3.1</a>, <a href="2-sv.html#SP3_2">&#167;3.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">underlying_var</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::get_variable</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">shv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">underlying_var</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>The match text associated with a shared variable is used in parsing action
patterns: see <a href="../if-module/4-anl.html" class="internal">Action Name Lists (in if)</a>. But for most shared variables, this
text remains empty.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::set_matching_text</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">StackedVariables::set_matching_text</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::get_matching_text</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Sets. </b>Sets are identified at run-time by an ID number, the "recognition ID", which
must be unique to that set and also small enough to be stored in what might
only be a 16-bit unsigned integer.
</p>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">StackedVariables::get_matching_text</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">recognition_id</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">creator_fn_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">shared_variable</span></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">StackedVariables::parse_match_clause</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">list_of_stvs</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::starts_with</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="function-syntax">StackedVariables::new_set</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::new_set</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">recognition_id</span><span class="plain-syntax"> = </span><span class="identifier-syntax">id</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_stvs</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">list_of_stvs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">creator_fn_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">StackedVariables::set_empty</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_stvs</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::set_empty</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">StackedVariables::add_empty</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">q</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Articles::remove_the</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner_id</span><span class="plain-syntax"> = </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">recognition_id</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_in_owning_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_stvs</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">assigned_at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">list_of_stvs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_stvs</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">max_frame_size_needed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">max_frame_size_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_stvs</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">q</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NonlocalVariables::new_with_scope</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">underlying_var</span><span class="plain-syntax"> = </span><span class="identifier-syntax">q</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTVariables::set_I6_identifier</span><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">RTVariables::stv_rvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTVariables::set_I6_identifier</span><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="identifier-syntax">RTVariables::stv_lvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">size_of_largest_set</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::add_to_set</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">SharedVariables::add_to_set</span></span>:<br/><a href="2-sv.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">) &gt; </span><span class="identifier-syntax">size_of_largest_set</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">size_of_largest_set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="function-syntax">StackedVariables::new_access_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nstvol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nstvol</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">nstvol</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::size_of_largest_set</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">size_of_largest_set</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure shared_variable_set is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>The creator function claims memory to store these variables, and initialises
them, at runtime. Other parts of Inform creating sets are expected to set this
function name (and thus specify where in the Inter hierarchy it will go), and
also to call <span class="extract"><span class="extract-syntax">RTVariables::compile_frame_creator</span></span>.
</p>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">StackedVariables::add_set_to_access_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::set_frame_creator</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">creator_fn_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::frame_creator</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">creator_fn_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>Returns the first variable in the set whose matching text begins <span class="extract"><span class="extract-syntax">W</span></span>. Note
that this requires the match text to be nonempty, so it can only return
variables which have one.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::parse_match_clause</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::starts_with</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Access lists. </b>These could hardly be simpler:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sets</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">shared_variable_set</span></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::new_access_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nshvol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nshvol</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">nshvol</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure shared_variable_access_list is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>Duplicates are not allowed:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::add_set_to_access_list</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">SharedVariables::add_set_to_access_list</span></span>:<br/><a href="2-sv.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">access</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">existing</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">access</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">existing</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">access</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">existing</span><span class="plain-syntax"> == </span><span class="identifier-syntax">set</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">access</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">access</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>This changes <span class="extract"><span class="extract-syntax">access</span></span> to the union of <span class="extract"><span class="extract-syntax">access</span></span> and <span class="extract"><span class="extract-syntax">extras</span></span>:
</p>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">StackedVariables::append_access_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">extras</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">;</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::append_access_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">extras</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">extras</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">access</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">extras</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::add_set_to_access_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">access</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">extras</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-sv.html#SP10" class="function-link"><span class="function-syntax">SharedVariables::add_set_to_access_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">access</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b>Returns the first shared variable of the given name <span class="extract"><span class="extract-syntax">W</span></span> in any set in the
access list. This would be inefficient if access lists were ever large, or
if individual sets were, but they are not. Giving each access list its own
associative hash would make little or no saving of time, and would decrease
the predictability of results.
</p>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">StackedVariables::index_owner</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">list_of_stvs</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">underlying_var</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::open_indented_p</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="string-syntax">"tight"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">IXVariables::index_one</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">underlying_var</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">StackedVariables::parse_from_access_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">,</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::parse_from_access_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Articles::remove_the</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">access</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">access</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::parse_from_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">list_of_stvs</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">access</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">StackedVariables::parse_from_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stvl</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">stvl</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">stv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">StackedVariables::compile_frame_creator</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">set</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Routines::begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pos_s</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP10" class="function-link"><span class="function-syntax">LocalVariables::add_named_call_as_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"pos"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state_s</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP10" class="function-link"><span class="function-syntax">LocalVariables::add_named_call_as_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"state"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">EQ_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">state_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-sv.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Compile frame creator if state is set</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-sv.html#SP3_2" class="named-paragraph-link"><span class="named-paragraph">Compile frame creator if state is clear</span><span class="named-paragraph-number">3.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">list_of_stvs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">RETURN_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">count</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Routines::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">creator_fn_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">count</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3_1" class="paragraph-anchor"></a><b>&#167;3.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile frame creator if state is set</span><span class="named-paragraph-number">3.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">list_of_stvs</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">q</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::get_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NonlocalVariables::kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">LOOKUPREF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">MSTACK_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTKinds::emit_heap_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTKinds::make_heap_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, -1));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTVariables::emit_initial_value_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">POSTINCREMENT_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-sv.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_2" class="paragraph-anchor"></a><b>&#167;3.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile frame creator if state is clear</span><span class="named-paragraph-number">3.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">list_of_stvs</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">q</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP3" class="function-link"><span class="function-syntax">StackedVariables::get_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NonlocalVariables::kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">BLKVALUEFREE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">LOOKUP_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">MSTACK_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">POSTINCREMENT_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-sv.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">StackedVariables::frame_creator</span><span class="plain-syntax">(</span><span class="reserved-syntax">stacked_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">creator_fn_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-lv.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-lv.html">lv</a></li><li class="progresscurrent">sv</li><li class="progresssection"><a href="2-pb.html">pb</a></li><li class="progresssection"><a href="2-sf.html">sf</a></li><li class="progresssection"><a href="2-chr.html">chr</a></li><li class="progresschapter"><a href="3-cfs.html">3</a></li><li class="progresschapter"><a href="4-inv.html">4</a></li><li class="progressnext"><a href="2-pb.html">&#10095;</a></li></ul></div>

View file

@ -166,7 +166,7 @@ can suppress the following problem messages:
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">asch</span><span class="plain-syntax">.</span><span class="identifier-syntax">involves_action_variables</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-sf.html#SP11" class="function-link"><span class="function-syntax">Frames::used_for_past_tense</span></a><span class="plain-syntax">()) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-sf.html#SP10" class="function-link"><span class="function-syntax">Frames::used_for_past_tense</span></a><span class="plain-syntax">()) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">suppress_C14ActionVarsPastTense</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">problem_count</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_ActionVarsPastTense</span><span class="plain-syntax">),</span>

View file

@ -181,7 +181,7 @@ we exit unexpectedly, for instance due to a problem.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">K</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">BLKVALUECOPY_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::emit_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP17" class="function-link"><span class="function-syntax">Frames::emit_new_local_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dereffed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>

View file

@ -799,7 +799,7 @@ defer it to a proposition with reason <span class="extract"><span class="extract
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ppd_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-cad.html#SP3" class="function-link"><span class="function-syntax">Calculus::Deferrals::Cinders::find_emit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::emit_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP17" class="function-link"><span class="function-syntax">Frames::emit_new_local_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTKinds::emit_strong_id_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::unary_construction_material</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
@ -817,7 +817,7 @@ defer it to a proposition with reason <span class="extract"><span class="extract
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-dtd.html#SP15" class="function-link"><span class="function-syntax">Calculus::Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">LIST_OF_TY_DESC_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::emit_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP17" class="function-link"><span class="function-syntax">Frames::emit_new_local_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-cfs.html#SP8" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_as_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTKinds::emit_strong_id_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::unary_construction_material</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>

View file

@ -86,7 +86,7 @@ in several different ways.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitSchemas::emit_expand_from_terms</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">EmitSchemas::emit_expand_from_terms</span></span>:<br/>Stack Frames - <a href="2-sf.html#SP14">&#167;14</a><br/>Compile Atoms - <a href="3-ca.html#SP3_2">&#167;3.2</a><br/>Compile Deferred Propositions - <a href="3-cdp.html#SP5">&#167;5</a><br/>Compile Invocations Inline - <a href="4-cii.html#SP3_5_4">&#167;3.5.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitSchemas::emit_expand_from_terms</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">EmitSchemas::emit_expand_from_terms</span></span>:<br/>Stack Frames - <a href="2-sf.html#SP17">&#167;17</a><br/>Compile Atoms - <a href="3-ca.html#SP3_2">&#167;3.2</a><br/>Compile Deferred Propositions - <a href="3-cdp.html#SP5">&#167;5</a><br/>Compile Invocations Inline - <a href="4-cii.html#SP3_5_4">&#167;3.5.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt2</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">semicolon</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">i6s_emission_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">ems</span><span class="plain-syntax"> = </span><a href="3-efs.html#SP1" class="function-link"><span class="function-syntax">EmitSchemas::state</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt2</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>

View file

@ -253,7 +253,7 @@ will be expressions being evaluated.
<span class="plain-syntax"> </span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><a href="4-inv.html#SP24" class="function-link"><span class="function-syntax">Invocations::first_in_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">invl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><a href="4-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_no_tokens</span></a><span class="plain-syntax">(</span><a href="4-inv.html#SP24" class="function-link"><span class="function-syntax">Invocations::first_in_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">invl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP13" class="function-link"><span class="function-syntax">Frames::need_at_least_this_many_formals</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP11" class="function-link"><span class="function-syntax">Frames::need_at_least_this_many_formals</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">void_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">manner_of_return</span><span class="plain-syntax"> == </span><span class="identifier-syntax">DECIDES_NOTHING_MOR</span><span class="plain-syntax">) </span><span class="identifier-syntax">void_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>

View file

@ -152,7 +152,7 @@ then follow, and finally the optional bitmap of phrase options.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">return_kind</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::emit_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">return_kind</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP17" class="function-link"><span class="function-syntax">Frames::emit_new_local_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">return_kind</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">k</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">k</span><span class="function-syntax">&lt;tokens-&gt;</span><span class="element-syntax">tokens_count</span><span class="plain-syntax">; </span><span class="identifier-syntax">k</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><a href="3-cfs.html#SP7" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">args</span><span class="plain-syntax">[</span><span class="identifier-syntax">k</span><span class="plain-syntax">], </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_required</span><span class="plain-syntax">[</span><span class="identifier-syntax">k</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrase_options</span><span class="plain-syntax"> != -1)</span>

View file

@ -194,7 +194,7 @@ checker has already done all of the work to decide what kind it has.)
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">lvar_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::emit_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP17" class="function-link"><span class="function-syntax">Frames::emit_new_local_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
</pre>
@ -324,7 +324,7 @@ the fixed text "phrase options" expands to the whole bitmap.
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;name-local-to-inline-stack-frame&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">local_variable</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">lvar</span><span class="Preform-plain-syntax"> = </span><a href="2-lv.html#SP23" class="function-link"><span class="Preform-function-syntax">LocalVariables::parse</span></a><span class="Preform-plain-syntax">(&amp;(</span><span class="Preform-identifier-syntax">idb_being_parsed</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-identifier-syntax">compilation_data</span><span class="Preform-plain-syntax">.</span><span class="Preform-identifier-syntax">stack_frame</span><span class="Preform-plain-syntax">), </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">local_variable</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">lvar</span><span class="Preform-plain-syntax"> = </span><a href="2-lv.html#SP23" class="function-link"><span class="Preform-function-syntax">LocalVariables::parse</span></a><span class="Preform-plain-syntax">(&amp;(</span><span class="Preform-identifier-syntax">idb_being_parsed</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-identifier-syntax">compilation_data</span><span class="Preform-plain-syntax">.</span><span class="Preform-identifier-syntax">id_stack_frame</span><span class="Preform-plain-syntax">), </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">lvar</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> ==&gt; { -, </span><span class="Preform-identifier-syntax">lvar</span><span class="Preform-plain-syntax"> };</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">TRUE</span><span class="Preform-plain-syntax">;</span>
@ -404,14 +404,14 @@ the presence of annotations can change what we do.
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-cii.html#SP3_1_1_4" class="named-paragraph-link"><span class="named-paragraph">Take account of any annotation to the inline token</span><span class="named-paragraph-number">3.1.1.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[27];</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-cii.html#SP3_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Work out values for the kind variables in this context</span><span class="named-paragraph-number">3.1.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">changed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_required</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::substitute</span><span class="plain-syntax">(</span><span class="identifier-syntax">IDTypeData::token_kind</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">tok</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">changed</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-cii.html#SP3_1_1_2" class="named-paragraph-link"><span class="named-paragraph">If the token has to be an lvalue, reject it if it isn't</span><span class="named-paragraph-number">3.1.1.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-cii.html#SP3_1_1_3" class="named-paragraph-link"><span class="named-paragraph">Compile the token value</span><span class="named-paragraph-number">3.1.1.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="constant-syntax">END_COMPILATION_MODE</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-cii.html#SP3_1">&#167;3.1</a>.</li></ul>
@ -420,7 +420,7 @@ the presence of annotations can change what we do.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[0] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=1; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;=26; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><a href="2-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::get_kind_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=1; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;=26; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><a href="2-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::get_kind_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_variable_declaration</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kvd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (; </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">; </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">=</span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">) </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[</span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">kv_number</span><span class="plain-syntax">] = </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">kv_value</span><span class="plain-syntax">;</span>
</pre>
@ -539,7 +539,7 @@ its own when kind variables are in play.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="4-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><a href="2-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::emit_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><a href="2-sf.html#SP17" class="function-link"><span class="function-syntax">Frames::emit_new_local_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-cii.html#SP3_2_1_2" class="named-paragraph-link"><span class="named-paragraph">Issue an inline no-such-kind problem</span><span class="named-paragraph-number">3.2.1.2</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">RTKinds::emit_default_value_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-cii.html#SP3_2_1_1" class="named-paragraph-link"><span class="named-paragraph">Issue problem for no natural choice</span><span class="named-paragraph-number">3.2.1.1</span></a></span><span class="plain-syntax">;</span>
@ -647,7 +647,7 @@ proposition.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineNew</span><span class="plain-syntax">), </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineNew</span><span class="plain-syntax">), </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"I don't know any kind called '%4'."</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-cii.html#SP3_2_1">&#167;3.2.1</a>, <a href="4-cii.html#SP3_2_3">&#167;3.2.3</a>, <a href="4-cii.html#SP3_2_4">&#167;3.2.4</a>, <a href="4-cii.html#SP3_2_5">&#167;3.2.5</a>, <a href="4-cii.html#SP3_2_6">&#167;3.2.6</a>, <a href="4-cii.html#SP3_2_7">&#167;3.2.7</a>, <a href="4-cii.html#SP3_2_8">&#167;3.2.8</a>, <a href="4-cii.html#SP3_5_8">&#167;3.5.8</a>.</li></ul>
@ -1055,7 +1055,7 @@ the problem messages are phrased differently if something goes wrong.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">returning_from_rule</span><span class="plain-syntax">) </span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rulebooks::kind_from_context</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::get_kind_returned</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::get_kind_returned</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_supplied</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">mor</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IDTypeData::get_mor</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">id_body_being_compiled</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">));</span>
@ -1605,7 +1605,7 @@ of the variable {-my:1} to S.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">to</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">from</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(5, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">operand2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineCopy</span><span class="plain-syntax">), </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineCopy</span><span class="plain-syntax">), </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The command to {-copy:...}, which asks to copy '%5' into '%4', has "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"gone wrong: I couldn't work those out."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
@ -1688,7 +1688,7 @@ variable.)
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">to_test</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">to_match</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(5, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">operand2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineMatchesDescription</span><span class="plain-syntax">), </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineMatchesDescription</span><span class="plain-syntax">), </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The command {-matches-description:...}, which asks to test whether "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"'%5' is a valid description for '%4', has gone wrong: I couldn't "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"work those out."</span><span class="plain-syntax">);</span>
@ -1714,7 +1714,7 @@ variable matches the given description.
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(5, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">operand2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineNowMatchesDescription</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The command {-now-matches-description:...}, which asks to change "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"'%4' so that '%5' becomes a valid description of it, has gone "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"wrong: I couldn't work those out."</span><span class="plain-syntax">);</span>
@ -1947,7 +1947,7 @@ the "group... together" phrases.
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ListTogether::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineListTogether</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The only legal forms here are {-list-together:articled} and "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"{-list-together:unarticled}."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
@ -2018,7 +2018,7 @@ especially those involving complicated linguistic propositions. For example:
<span class="plain-syntax"> </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">extremal_property</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">extremal_property_sign</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineExtremal</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"In the '{-primitive-definition:extremal...}' command, there "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"should be a '&lt;' or '&gt;' sign then the name of a property."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
@ -2046,7 +2046,7 @@ especially those involving complicated linguistic propositions. For example:
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlinePrimitive</span><span class="plain-syntax">), </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlinePrimitive</span><span class="plain-syntax">), </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"I don't know any primitive definition called '%4'."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
@ -2062,7 +2062,7 @@ especially those involving complicated linguistic propositions. For example:
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">fn_kind</span><span class="plain-syntax">) != </span><span class="identifier-syntax">CON_phrase</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_spec</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">fn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineFunctionApplication</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"A function application only makes sense if the first token, "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"'%4', is a phrase: here it isn't."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
@ -2114,7 +2114,7 @@ especially those involving complicated linguistic propositions. For example:
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineNoSuch</span><span class="plain-syntax">), </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineNoSuch</span><span class="plain-syntax">), </span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"I don't know any local variable called '%4'."</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-cii.html#SP3_5_2">&#167;3.5.2</a>, <a href="4-cii.html#SP3_5_8">&#167;3.5.8</a>, <a href="4-cii.html#SP3_5_9">&#167;3.5.9</a>.</li></ul>
@ -2137,7 +2137,7 @@ then the operand refers to its value in the current invocation;
<span class="plain-syntax"> </span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">[</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">) - </span><span class="character-syntax">'0'</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">LW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP23" class="function-link"><span class="function-syntax">LocalVariables::parse</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax">), </span><span class="identifier-syntax">LW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP23" class="function-link"><span class="function-syntax">LocalVariables::parse</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">id_stack_frame</span><span class="plain-syntax">), </span><span class="identifier-syntax">LW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tok</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP8" class="function-link"><span class="function-syntax">LocalVariables::get_parameter_number</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tok</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">args</span><span class="plain-syntax">[</span><span class="identifier-syntax">tok</span><span class="plain-syntax">];</span>
@ -2173,17 +2173,17 @@ which would safely abandon any attempt to define a value like this:
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></span>:<br/><a href="4-cii.html#SP3_2_1">&#167;3.2.1</a>, <a href="4-cii.html#SP3_2_2">&#167;3.2.2</a>, <a href="4-cii.html#SP3_2_3">&#167;3.2.3</a>, <a href="4-cii.html#SP3_2_4">&#167;3.2.4</a>, <a href="4-cii.html#SP3_2_5">&#167;3.2.5</a>, <a href="4-cii.html#SP3_2_6">&#167;3.2.6</a>, <a href="4-cii.html#SP3_2_7">&#167;3.2.7</a>, <a href="4-cii.html#SP3_2_8">&#167;3.2.8</a>, <a href="4-cii.html#SP3_5_1_1_1">&#167;3.5.1.1.1</a>, <a href="4-cii.html#SP3_5_3">&#167;3.5.3</a>, <a href="4-cii.html#SP3_5_8">&#167;3.5.8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_variable_declaration</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kvd</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"return-kind"</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::get_kind_returned</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"return-kind"</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::get_kind_returned</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"rule-return-kind"</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Rulebooks::kind_from_context</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[27];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;27; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (; </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">; </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">=</span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">) </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[</span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">kv_number</span><span class="plain-syntax">] = </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">kv_value</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">KW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;s-type-expression&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">KW</span><span class="plain-syntax">)) </span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>

View file

@ -100,7 +100,7 @@ should always be supplied for "To..." phrases, but left null for rules.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Routines::Compile::routine</span><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">legible</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_phrase_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">req</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">legible</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_phrase_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">req</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">code_at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ImperativeDefinitions::body_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">code_at</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">, </span><span class="identifier-syntax">DEFN_CONT_NT</span><span class="plain-syntax">)) </span><span class="identifier-syntax">code_at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">code_at</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">;</span>
@ -112,7 +112,7 @@ should always be supplied for "To..." phrases, but left null for rules.
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-cp.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Compile some commentary about the routine to follow</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Routines::begin_framed</span><span class="plain-syntax">(</span><a href="4-cp.html#SP3" class="function-link"><span class="function-syntax">Routines::Compile::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Routines::begin_framed</span><span class="plain-syntax">(</span><a href="4-cp.html#SP3" class="function-link"><span class="function-syntax">Routines::Compile::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">id_stack_frame</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-cp.html#SP2_3" class="named-paragraph-link"><span class="named-paragraph">Compile the body of the routine</span><span class="named-paragraph-number">2.3</span></a></span><span class="plain-syntax">;</span>
@ -135,20 +135,20 @@ should always be supplied for "To..." phrases, but left null for rules.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">id_stack_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idtd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::make_current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP3" class="function-link"><span class="function-syntax">Frames::make_current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">version_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">req</span><span class="plain-syntax">) </span><span class="identifier-syntax">version_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PhraseRequests::kind_of_request</span><span class="plain-syntax">(</span><span class="identifier-syntax">req</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">version_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IDTypeData::kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">idtd</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">IDCompilation::initialise_stack_frame_from_type_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">idtd</span><span class="plain-syntax">, </span><span class="identifier-syntax">version_kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">req</span><span class="plain-syntax">) </span><a href="2-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::set_kind_variables</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">req</span><span class="plain-syntax">) </span><a href="2-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::set_kind_variables</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PhraseRequests::kind_variables_for_request</span><span class="plain-syntax">(</span><span class="identifier-syntax">req</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::set_kind_variables</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::set_kind_variables</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP10" class="function-link"><span class="function-syntax">Frames::set_stvol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">legible</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::set_shared_variable_access_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">legible</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-lv.html#SP15" class="function-link"><span class="function-syntax">LocalVariables::deallocate_all</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">); </span><span class="comment-syntax"> in case any are left from an earlier compile</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformCache::warn_of_changes</span><span class="plain-syntax">(); </span><span class="comment-syntax"> that local variables may have changed</span>
@ -184,7 +184,7 @@ to us, so we end our routine with code which certainly performs a return.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">RETURN_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::get_kind_returned</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::get_kind_returned</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">RTKinds::emit_default_value_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"value decided by this phrase"</span><span class="plain-syntax">) != </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) {</span>

View file

@ -227,7 +227,7 @@ corresponding local variable.
<span class="plain-syntax"> </span><span class="identifier-syntax">equation_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ev</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ev</span><span class="plain-syntax"> = </span><span class="identifier-syntax">eqn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">ev</span><span class="plain-syntax">; </span><span class="identifier-syntax">ev</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ev</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ev</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">var_const</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ev</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_map</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP23" class="function-link"><span class="function-syntax">LocalVariables::parse</span></a><span class="plain-syntax">(</span><a href="2-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">ev</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ev</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_map</span><span class="plain-syntax"> = </span><a href="2-lv.html#SP23" class="function-link"><span class="function-syntax">LocalVariables::parse</span></a><span class="plain-syntax">(</span><a href="2-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">ev</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ev</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">promote_local_to_real</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ev</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">local_map</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-cste.html#SP3_3_1" class="named-paragraph-link"><span class="named-paragraph">Can't find an unset symbol among the local variables</span><span class="named-paragraph-number">3.3.1</span></a></span>

View file

@ -96,8 +96,8 @@
</li>
<li>
<p class="sectionentry"><a href="2-sv.html">
<spon class="sectiontitle">Stacked Variables</span></a> -
<span class="sectionpurpose">To permit variables to have scopes intermediate between local and global: for example, to be shared by all rules in a given rulebook.</span></p>
<spon class="sectiontitle">Shared Variables</span></a> -
<span class="sectionpurpose">Shared variables are held in common by all rules in a given rulebook.</span></p>
</li>
<li>
<p class="sectionentry"><a href="2-pb.html">
@ -107,7 +107,7 @@
<li>
<p class="sectionentry"><a href="2-sf.html">
<spon class="sectiontitle">Stack Frames</span></a> -
<span class="sectionpurpose">When Inform compiles phrase invocations, or implied forms of these such as text substitutions, it does so in the context of a "stack frame". This provides for local "let" values, manages loop blocks, and in general looks after any information shared between a whole sequence of invocations.</span></p>
<span class="sectionpurpose">When Inform compiles imperative code, it does so in the context of a "stack frame".</span></p>
</li>
<li>
<p class="sectionentry"><a href="2-chr.html">

View file

@ -150,6 +150,16 @@ the following:
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Textual::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nlv_kind</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;/i&gt;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">IXVariables::index_stv_set</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">IXVariables::index_stv_set</span></span>:<br/>Actions - <a href="3-act.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">variables</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">underlying_var</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::open_indented_p</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="string-syntax">"tight"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-vrb.html#SP3" class="function-link"><span class="function-syntax">IXVariables::index_one</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">underlying_var</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-adj.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-ifs.html">ifs</a></li><li class="progresssection"><a href="2-dr.html">dr</a></li><li class="progresssection"><a href="2-li.html">li</a></li><li class="progresssection"><a href="2-ipw.html">ipw</a></li><li class="progresssection"><a href="2-ki.html">ki</a></li><li class="progresssection"><a href="2-ie.html">ie</a></li><li class="progresssection"><a href="2-ih.html">ih</a></li><li class="progresssection"><a href="2-ins.html">ins</a></li><li class="progresssection"><a href="2-adj.html">adj</a></li><li class="progresscurrent">vrb</li><li class="progresssection"><a href="2-prp.html">prp</a></li><li class="progresssection"><a href="2-inf.html">inf</a></li><li class="progresssection"><a href="2-rls.html">rls</a></li><li class="progresssection"><a href="2-act.html">act</a></li><li class="progresssection"><a href="2-pi.html">pi</a></li><li class="progresschapter"><a href="3-fgr.html">3</a></li><li class="progresschapter"><a href="4-sg.html">4</a></li><li class="progressnext"><a href="2-prp.html">&#10095;</a></li></ul></div>

View file

@ -192,9 +192,9 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-ci.html#SP10" class="function-link"><span class="function-syntax">CommandsIndex::index_list_with_action</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">command_parser_grammar_producing_this</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;i&gt;None&lt;/i&gt;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">StackedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">SharedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">); </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;b&gt;Named values belonging to this action&lt;/b&gt;\n"</span><span class="plain-syntax">); </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::index_owner</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-vrb.html#SP3" class="function-link"><span class="function-syntax">IXVariables::index_stv_set</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">); </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;b&gt;Rules controlling this action&lt;/b&gt;"</span><span class="plain-syntax">); </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>

View file

@ -392,7 +392,7 @@ interpret no indication of a kind as meaning "object".
<span class="plain-syntax"> </span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">q</span><span class="plain-syntax"> = </span><a href="2-nv.html#SP2" class="function-link"><span class="function-syntax">NonlocalVariables::new_global</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NW</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_interpretation_as_infs</span><span class="plain-syntax">[</span><span class="identifier-syntax">v</span><span class="plain-syntax">] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_interpretation_as_spec</span><span class="plain-syntax">[</span><span class="identifier-syntax">v</span><span class="plain-syntax">] = </span><span class="identifier-syntax">Lvalues::new_actual_NONLOCAL_VARIABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">is_a_const</span><span class="plain-syntax">) </span><a href="2-nv.html#SP12" class="function-link"><span class="function-syntax">NonlocalVariables::make_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">is_a_const</span><span class="plain-syntax">) </span><a href="2-nv.html#SP11" class="function-link"><span class="function-syntax">NonlocalVariables::make_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nc</span><span class="plain-syntax"> = </span><a href="2-ins.html#SP4" class="function-link"><span class="function-syntax">Instances::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NW</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_interpretation_as_infs</span><span class="plain-syntax">[</span><span class="identifier-syntax">v</span><span class="plain-syntax">] = </span><a href="2-ins.html#SP6" class="function-link"><span class="function-syntax">Instances::as_subject</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nc</span><span class="plain-syntax">);</span>
@ -625,7 +625,7 @@ but just in case.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">diversion</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-nv.html#SP14" class="function-link"><span class="function-syntax">NonlocalVariables::get_alias</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_constant_nonlocal_variable</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-nv.html#SP13" class="function-link"><span class="function-syntax">NonlocalVariables::get_alias</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_constant_nonlocal_variable</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">diversion</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">diversion</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>

View file

@ -94,7 +94,7 @@ These variables are created by assertion sentences.
<p class="commentary">These semantics are so different that it makes no compelling sense to try to
give them a common implementation inside the compiler; so, nonlocal variables
are handled below, but local variables have a different implementation at
<a href="../imperative-module/4-lv.html" class="internal">Local Variables (in imperative)</a>.
<a href="../imperative-module/2-lv.html" class="internal">Local Variables (in imperative)</a>.
</p>
<p class="commentary">A pragmatic, but questionable,<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup> implementation decision by Inform is that
@ -116,7 +116,7 @@ closer to global variables than to literals such as <span class="extract"><span
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax">; </span><span class="comment-syntax"> text of the name</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv_kind</span><span class="plain-syntax">; </span><span class="comment-syntax"> what kind of value it holds</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">scope</span><span class="plain-syntax">; </span><span class="comment-syntax"> where it exists, or </span><span class="extract"><span class="extract-syntax">NULL</span></span><span class="comment-syntax"> for everywhere</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">scope</span><span class="plain-syntax">; </span><span class="comment-syntax"> where it exists, or </span><span class="extract"><span class="extract-syntax">NULL</span></span><span class="comment-syntax"> for everywhere</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">as_subject</span><span class="plain-syntax">; </span><span class="comment-syntax"> so that assertions can discuss it...</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">alias_subject</span><span class="plain-syntax">; </span><span class="comment-syntax"> ...or perhaps the thing it aliases</span>
@ -143,14 +143,14 @@ reference to how it's stored at run-time.
<p class="commentary">Note that we only register the name of the variable as a proper noun if it's
global and will live forever, because nouns are both of those things. Anyone
creating a stacked variable will have to make their own arrangements to parse
creating a shared variable will have to make their own arrangements to parse
the names of them.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">NonlocalVariables::new_global</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">NonlocalVariables::new_global</span></span>:<br/>Assert Propositions - <a href="1-ap.html#SP6_5_2">&#167;6.5.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">PROTECTED_MODEL_PROCEDURE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><a href="2-nv.html#SP5" class="function-link"><span class="function-syntax">NonlocalVariables::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><a href="2-nv.html#SP4" class="function-link"><span class="function-syntax">NonlocalVariables::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADD_TO_LEXICON_NTOPT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VARIABLE_MC</span><span class="plain-syntax">, </span><span class="identifier-syntax">Lvalues::new_actual_NONLOCAL_VARIABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">),</span>
@ -164,7 +164,7 @@ only match globals, since variables of lesser scope are not in the lexicon.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">NonlocalVariables::parse_global</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">NonlocalVariables::parse_global</span></span>:<br/><a href="2-nv.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">NonlocalVariables::parse_global</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">NonlocalVariables::parse_global</span></span>:<br/><a href="2-nv.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Articles::remove_the</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;s-global-variable&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</span><span class="plain-syntax">;</span>
@ -173,18 +173,7 @@ only match globals, since variables of lesser scope are not in the lexicon.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>This one is unprotected, that is, can be called outside of asserting some
proposition; that's because variables with a finite lifetime are not part
of the model, since they do not exist at the start of play.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">NonlocalVariables::new_with_scope</span><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">scope</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-nv.html#SP5" class="function-link"><span class="function-syntax">NonlocalVariables::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">scope</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>We record the one most recently made:
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>We record the one most recently made:
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -193,10 +182,10 @@ of the model, since they do not exist at the start of play.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">latest_nonlocal_variable</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">NonlocalVariables::new</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">NonlocalVariables::new</span></span>:<br/><a href="2-nv.html#SP2">&#167;2</a>, <a href="2-nv.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">scope</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">NonlocalVariables::new</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">NonlocalVariables::new</span></span>:<br/><a href="2-nv.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"created variable without kind"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::definite</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-nv.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Issue problem message for an indefinite variable</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-nv.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Issue problem message for an indefinite variable</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">latest_nonlocal_variable</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">;</span>
@ -207,7 +196,7 @@ of the model, since they do not exist at the start of play.
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alias_subject</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constant_at_run_time</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">var_is_allowed_to_be_zero</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">scope</span><span class="plain-syntax"> = </span><span class="identifier-syntax">scope</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">scope</span><span class="plain-syntax"> = </span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">substitution_marker</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_subject</span><span class="plain-syntax"> = </span><a href="4-vs.html#SP1" class="function-link"><span class="function-syntax">VariableSubjects::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTVariables::new_compilation_data</span><span class="plain-syntax">();</span>
@ -219,7 +208,7 @@ of the model, since they do not exist at the start of play.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>&#167;5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue problem message for an indefinite variable</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP4_1" class="paragraph-anchor"></a><b>&#167;4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue problem message for an indefinite variable</span><span class="named-paragraph-number">4.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -235,13 +224,13 @@ of the model, since they do not exist at the start of play.
<span class="plain-syntax"> </span><span class="string-syntax">"is a list of numbers that varies' would be better."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-nv.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>So much for creation; and here's how we log and write them:
<ul class="endnotetexts"><li>This code is used in <a href="2-nv.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>So much for creation; and here's how we log and write them:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NonlocalVariables::log</span><span class="plain-syntax">(</span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-nv.html#SP6" class="function-link"><span class="function-syntax">NonlocalVariables::write</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nv.html#SP5" class="function-link"><span class="function-syntax">NonlocalVariables::write</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NonlocalVariables::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
@ -250,7 +239,7 @@ of the model, since they do not exist at the start of play.
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Textual::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">nlv_kind</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>The author can demand with a "translates as" sentence that a given
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>The author can demand with a "translates as" sentence that a given
variable is equivalent to an Inter variable supplied in some kit:
</p>
@ -274,16 +263,16 @@ variable is equivalent to an Inter variable supplied in some kit:
<span class="plain-syntax"> </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p2</span><span class="plain-syntax">)));</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>Nonlocal variables are inference subjects in order that they can be given
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>Nonlocal variables are inference subjects in order that they can be given
initial values by inference: see <a href="4-vs.html" class="internal">Variable Subjects</a> for more.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="function-syntax">NonlocalVariables::to_subject</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">NonlocalVariables::to_subject</span></span>:<br/><a href="2-nv.html#SP11">&#167;11</a><br/>Variable Subjects - <a href="4-vs.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="function-syntax">NonlocalVariables::to_subject</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">NonlocalVariables::to_subject</span></span>:<br/><a href="2-nv.html#SP10">&#167;10</a><br/>Variable Subjects - <a href="4-vs.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_subject</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>Now for some basic properties:
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>Now for some basic properties:
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -301,7 +290,7 @@ initial values by inference: see <a href="4-vs.html" class="internal">Variable S
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">var_is_allowed_to_be_zero</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>The kind can in fact be changed after creation, though this never happens
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>The kind can in fact be changed after creation, though this never happens
to variables declared in source text: it allows us to have a few globals which
are reused for different purposes and are typeless.
</p>
@ -312,14 +301,14 @@ are reused for different purposes and are typeless.
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">nlv_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>This is a curiosity, used to force the textual contents of a bibliographic
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>This is a curiosity, used to force the textual contents of a bibliographic
data variable (such as "story title") to be treated as text.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">NonlocalVariables::initial_value_as_plain_text</span><span class="plain-syntax">(</span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><a href="2-nv.html#SP8" class="function-link"><span class="function-syntax">NonlocalVariables::to_subject</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><a href="2-nv.html#SP7" class="function-link"><span class="function-syntax">NonlocalVariables::to_subject</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">POSITIVE_KNOWLEDGE_LOOP</span><span class="plain-syntax">(</span><span class="identifier-syntax">inf</span><span class="plain-syntax">, </span><span class="identifier-syntax">infs</span><span class="plain-syntax">, </span><span class="identifier-syntax">property_inf</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-pi.html#SP7" class="function-link"><span class="function-syntax">PropertyInferences::get_property</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inf</span><span class="plain-syntax">) == </span><span class="identifier-syntax">P_variable_initial_value</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span>
@ -327,7 +316,7 @@ data variable (such as "story title") to be treated as text.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b>"Constant" means that no change is permitted at run-time; "initialisable"
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>"Constant" means that no change is permitted at run-time; "initialisable"
means that a value can be set by an assertion in the source text.
</p>
@ -355,7 +344,7 @@ means that a value can be set by an assertion in the source text.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. </b>Substitution is the down-side if handling constants as if they were variables.
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b>Substitution is the down-side if handling constants as if they were variables.
At some point, the constant has to be replaced by its value, and this is where.
Note that it's easy to imagine a chain of constants defined each as being
equal to the next, but that a cycle of those is illegal.
@ -391,7 +380,7 @@ equal to the next, but that a cycle of those is illegal.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">spec</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. </b>"Aliasing" is the ability to divert inferences about a variable to
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. </b>"Aliasing" is the ability to divert inferences about a variable to
inferences about something else. Inform uses this for interactive fiction
projects with "the player"; authors tend to think "the player" is an instance
and they write assertions accordingly, but in fact it's a variable. Because

View file

@ -378,7 +378,7 @@ kinds and instances.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="function-syntax">InferenceSubjects::from_specification</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">InferenceSubjects::from_specification</span></span>:<br/><a href="4-is.html#SP9">&#167;9</a><br/>Assert Propositions - <a href="1-ap.html#SP9">&#167;9</a><br/>Nonlocal Variables - <a href="2-nv.html#SP14">&#167;14</a><br/>Relation Subjects - <a href="4-rs.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="function-syntax">InferenceSubjects::from_specification</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">InferenceSubjects::from_specification</span></span>:<br/><a href="4-is.html#SP9">&#167;9</a><br/>Assert Propositions - <a href="1-ap.html#SP9">&#167;9</a><br/>Nonlocal Variables - <a href="2-nv.html#SP13">&#167;13</a><br/>Relation Subjects - <a href="4-rs.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Specifications::is_kind_like</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>

View file

@ -107,7 +107,7 @@ property <span class="extract"><span class="extract-syntax">P_variable_initial_v
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="function-syntax">VariableSubjects::new</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">VariableSubjects::new</span></span>:<br/>Nonlocal Variables - <a href="2-nv.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="function-syntax">VariableSubjects::new</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">VariableSubjects::new</span></span>:<br/>Nonlocal Variables - <a href="2-nv.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-is.html#SP7" class="function-link"><span class="function-syntax">InferenceSubjects::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">global_variables</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="4-vs.html#SP1" class="function-link"><span class="function-syntax">VariableSubjects::family</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_POINTER_nonlocal_variable</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -127,7 +127,7 @@ about the same subject.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">inference</span><span class="plain-syntax"> *</span><span class="function-syntax">VariableSubjects::get_initial_value_inference</span><span class="plain-syntax">(</span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><a href="2-nv.html#SP8" class="function-link"><span class="function-syntax">NonlocalVariables::to_subject</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><a href="2-nv.html#SP7" class="function-link"><span class="function-syntax">NonlocalVariables::to_subject</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">POSITIVE_KNOWLEDGE_LOOP</span><span class="plain-syntax">(</span><span class="identifier-syntax">inf</span><span class="plain-syntax">, </span><span class="identifier-syntax">infs</span><span class="plain-syntax">, </span><span class="identifier-syntax">property_inf</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-pi.html#SP7" class="function-link"><span class="function-syntax">PropertyInferences::get_property</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inf</span><span class="plain-syntax">) == </span><span class="identifier-syntax">P_variable_initial_value</span><span class="plain-syntax">)</span>
@ -136,7 +136,7 @@ about the same subject.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">VariableSubjects::get_initial_value</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">VariableSubjects::get_initial_value</span></span>:<br/><a href="4-vs.html#SP4">&#167;4</a><br/>Nonlocal Variables - <a href="2-nv.html#SP13">&#167;13</a>, <a href="2-nv.html#SP14">&#167;14</a><br/>Inference Subjects - <a href="4-is.html#SP8">&#167;8</a>, <a href="4-is.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">VariableSubjects::get_initial_value</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">VariableSubjects::get_initial_value</span></span>:<br/><a href="4-vs.html#SP4">&#167;4</a><br/>Nonlocal Variables - <a href="2-nv.html#SP12">&#167;12</a>, <a href="2-nv.html#SP13">&#167;13</a><br/>Inference Subjects - <a href="4-is.html#SP8">&#167;8</a>, <a href="4-is.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inference</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inf</span><span class="plain-syntax"> = </span><a href="4-vs.html#SP2" class="function-link"><span class="function-syntax">VariableSubjects::get_initial_value_inference</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">inf</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-pi.html#SP7" class="function-link"><span class="function-syntax">PropertyInferences::get_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Specifications::new_UNKNOWN</span><span class="plain-syntax">(</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
@ -188,7 +188,7 @@ is "room" would therefore be uncheckable at assertion time.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">model_checking_stage</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to initialise null variable"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_as_declared</span><span class="plain-syntax"> = </span><a href="2-nv.html#SP9" class="function-link"><span class="function-syntax">NonlocalVariables::kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_as_declared</span><span class="plain-syntax"> = </span><a href="2-nv.html#SP8" class="function-link"><span class="function-syntax">NonlocalVariables::kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">constant_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">outcome</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::compatible</span><span class="plain-syntax">(</span><span class="identifier-syntax">constant_kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_as_declared</span><span class="plain-syntax">);</span>

View file

@ -238,7 +238,7 @@ and properties which store the state of certain relations.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">property</span><span class="plain-syntax"> *</span><span class="function-syntax">PropertyInferences::get_property</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">PropertyInferences::get_property</span></span>:<br/><a href="5-pi.html#SP9">&#167;9</a>, <a href="5-pi.html#SP10">&#167;10</a>, <a href="5-pi.html#SP12">&#167;12</a>, <a href="5-pi.html#SP14">&#167;14</a><br/>Nonlocal Variables - <a href="2-nv.html#SP11">&#167;11</a><br/>Properties - <a href="3-prp.html#SP17">&#167;17</a><br/>Variable Subjects - <a href="4-vs.html#SP2">&#167;2</a><br/>Relation Subjects - <a href="4-rs.html#SP4">&#167;4</a><br/>Indefinite Appearance - <a href="5-ia.html#SP1">&#167;1</a>, <a href="5-ia.html#SP2">&#167;2</a><br/>The Model World - <a href="5-tmw.html#SP4_1">&#167;4.1</a>, <a href="5-tmw.html#SP4_2">&#167;4.2</a>, <a href="5-tmw.html#SP4_2_1">&#167;4.2.1</a><br/>The Naming Thicket - <a href="5-tnt.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">property</span><span class="plain-syntax"> *</span><span class="function-syntax">PropertyInferences::get_property</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">PropertyInferences::get_property</span></span>:<br/><a href="5-pi.html#SP9">&#167;9</a>, <a href="5-pi.html#SP10">&#167;10</a>, <a href="5-pi.html#SP12">&#167;12</a>, <a href="5-pi.html#SP14">&#167;14</a><br/>Nonlocal Variables - <a href="2-nv.html#SP10">&#167;10</a><br/>Properties - <a href="3-prp.html#SP17">&#167;17</a><br/>Variable Subjects - <a href="4-vs.html#SP2">&#167;2</a><br/>Relation Subjects - <a href="4-rs.html#SP4">&#167;4</a><br/>Indefinite Appearance - <a href="5-ia.html#SP1">&#167;1</a>, <a href="5-ia.html#SP2">&#167;2</a><br/>The Model World - <a href="5-tmw.html#SP4_1">&#167;4.1</a>, <a href="5-tmw.html#SP4_2">&#167;4.2</a>, <a href="5-tmw.html#SP4_2_1">&#167;4.2.1</a><br/>The Naming Thicket - <a href="5-tnt.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">family</span><span class="plain-syntax"> != </span><span class="identifier-syntax">property_inf</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">property_inference_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_property_inference_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">data</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inferred_property</span><span class="plain-syntax">;</span>
@ -255,7 +255,7 @@ the initial value property to be textual for certain bibliographic data.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">PropertyInferences::set_value_kind</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">PropertyInferences::set_value_kind</span></span>:<br/>Nonlocal Variables - <a href="2-nv.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">PropertyInferences::set_value_kind</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">PropertyInferences::set_value_kind</span></span>:<br/>Nonlocal Variables - <a href="2-nv.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">property_inference_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_property_inference_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Node::set_kind_of_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">data</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inferred_property_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">data</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inferred_property_value</span><span class="plain-syntax">;</span>

View file

@ -182,7 +182,7 @@ but that's now easy, as we just have to read off the annotation made above &mdas
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">compilation_unit</span><span class="plain-syntax"> *</span><span class="function-syntax">CompilationUnits::find</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">CompilationUnits::find</span></span>:<br/><a href="2-cu.html#SP6">&#167;6</a><br/>Hierarchy - <a href="2-hrr.html#SP4">&#167;4</a><br/>Variables - <a href="4-vrb.html#SP4">&#167;4</a><br/>Properties - <a href="4-prp.html#SP1">&#167;1</a><br/>Verbs at Run Time - <a href="4-vart.html#SP2">&#167;2</a><br/>Relations at Run Time - <a href="4-rart.html#SP1">&#167;1</a><br/>Runtime Support for Tables - <a href="4-rsft.html#SP3">&#167;3</a><br/>Imperative Compilation Data - <a href="4-icd.html#SP3">&#167;3</a><br/>Phrase Requests - <a href="4-pr.html#SP3">&#167;3</a><br/>General Parsing Routines - <a href="5-gpr.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">compilation_unit</span><span class="plain-syntax"> *</span><span class="function-syntax">CompilationUnits::find</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">CompilationUnits::find</span></span>:<br/><a href="2-cu.html#SP6">&#167;6</a><br/>Hierarchy - <a href="2-hrr.html#SP4">&#167;4</a><br/>Variables - <a href="4-vrb.html#SP5">&#167;5</a><br/>Properties - <a href="4-prp.html#SP1">&#167;1</a><br/>Verbs at Run Time - <a href="4-vart.html#SP2">&#167;2</a><br/>Relations at Run Time - <a href="4-rart.html#SP1">&#167;1</a><br/>Runtime Support for Tables - <a href="4-rsft.html#SP3">&#167;3</a><br/>Imperative Compilation Data - <a href="4-icd.html#SP3">&#167;3</a><br/>Phrase Requests - <a href="4-pr.html#SP3">&#167;3</a><br/>General Parsing Routines - <a href="5-gpr.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">from</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Node::get_unit</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -110,7 +110,7 @@ function togglePopup(material_id) {
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Condition::generate_in_support_function</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Phrases::Condition::generate_in_support_function</span></span>:<br/><a href="3-abc.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">adjective_meaning_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">family</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">adjective_meaning</span><span class="plain-syntax"> *</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">emit_flag</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">adjective_meaning</span><span class="plain-syntax"> *</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">emit_flag</span><span class="plain-syntax">, </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">def</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_definition</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">family_specific_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEST_ATOM_TASK:</span>

View file

@ -212,9 +212,10 @@ function togglePopup(material_id) {
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTActivities::activity_var_creators</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">activity</span><span class="plain-syntax"> *</span><span class="identifier-syntax">av</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">, </span><span class="identifier-syntax">activity</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">StackedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">activity_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">SharedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">activity_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ACTIVITY_STV_CREATOR_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">av_package</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::compile_frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">activity_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::set_frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">activity_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP4" class="function-link"><span class="function-syntax">RTVariables::compile_frame_creator</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">activity_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -222,8 +223,8 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::named_array_begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">, </span><span class="identifier-syntax">activity</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">StackedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">activity_variables</span><span class="plain-syntax">)) </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_iname_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">StackedVariables::frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">activity_variables</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">SharedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">activity_variables</span><span class="plain-syntax">)) </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_iname_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SharedVariables::frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">activity_variables</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">(0);</span>

View file

@ -269,7 +269,7 @@ have multiple definitions is "object", but that may change.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTAdjectives::list_compile</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">RTAdjectives::list_compile</span></span>:<br/><a href="4-adj.html#SP3_2">&#167;3.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">adjective</span><span class="plain-syntax"> *</span><span class="identifier-syntax">adj</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t0_s</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t0_s</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">adjective_meaning</span><span class="plain-syntax"> *</span><span class="identifier-syntax">am</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">adjective_meaning</span><span class="plain-syntax">, </span><span class="identifier-syntax">adj</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">adjective_meanings</span><span class="plain-syntax">.</span><span class="identifier-syntax">in_precedence_order</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">AdjectiveMeanings::can_generate_in_support_function</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">)) &amp;&amp;</span>

View file

@ -100,7 +100,7 @@ code below.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_defn_converted</span><span class="plain-syntax">; </span><span class="comment-syntax"> has this been tried yet?</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> or NULL for inline phrases</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">requests_package</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">id_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">permit_all_outcomes</span><span class="plain-syntax">; </span><span class="comment-syntax"> waive the usual restrictions on rule outcomes</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">id_compilation_data</span><span class="plain-syntax">;</span>
</pre>
@ -120,7 +120,7 @@ code below.
<span class="plain-syntax"> </span><span class="identifier-syntax">phcd</span><span class="plain-syntax">.</span><span class="element-syntax">requests_package</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phcd</span><span class="plain-syntax">.</span><span class="element-syntax">at_least_one_compiled_form_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phcd</span><span class="plain-syntax">.</span><span class="element-syntax">compile_with_run_time_debugging</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phcd</span><span class="plain-syntax">.</span><span class="element-syntax">stack_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phcd</span><span class="plain-syntax">.</span><span class="element-syntax">id_stack_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phcd</span><span class="plain-syntax">.</span><span class="element-syntax">permit_all_outcomes</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">phcd</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -136,10 +136,10 @@ code below.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">IDCompilation::prepare_stack_frame</span><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="4-icd.html#SP5" class="function-link"><span class="function-syntax">IDCompilation::initialise_stack_frame_from_type_data</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">id_stack_frame</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">IDTypeData::kind</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">)), </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PhraseOptions::allows_options</span><span class="plain-syntax">(</span><span class="identifier-syntax">body</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LocalVariables::options_parameter_is_needed</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">stack_frame</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LocalVariables::options_parameter_is_needed</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">id_stack_frame</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>Suppose Inform is compiling code to represent this:
@ -185,7 +185,7 @@ variables "new entry" and "L" with those kinds.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">IDCompilation::initialise_stack_frame_from_type_data</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">IDCompilation::initialise_stack_frame_from_type_data</span></span>:<br/><a href="4-icd.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">IDCompilation::initialise_stack_frame_from_type_data</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">IDCompilation::initialise_stack_frame_from_type_data</span></span>:<br/><a href="4-icd.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idtd</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_in_this_compilation</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">first</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_in_this_compilation</span><span class="plain-syntax">) != </span><span class="identifier-syntax">CON_phrase</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no function kind"</span><span class="plain-syntax">);</span>
@ -261,7 +261,7 @@ response to "requests". All other phrases are compiled just once.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">IDCompilation::compile</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">IDCompilation::compile</span></span>:<br/>Rules - <a href="4-rls.html#SP3">&#167;3</a><br/>Phrase Requests - <a href="4-pr.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">max_i</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stacked_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">legible</span><span class="plain-syntax">, </span><span class="reserved-syntax">to_phrase_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">legible</span><span class="plain-syntax">, </span><span class="reserved-syntax">to_phrase_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">req</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">at_least_one_compiled_form_needed</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Routines::Compile::routine</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">legible</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">at_least_one_compiled_form_needed</span><span class="plain-syntax">) {</span>

View file

@ -2031,7 +2031,7 @@ whether or not $R(<span class="extract"><span class="extract-syntax">t_0</span><
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="4-rtn.html#SP2" class="function-link"><span class="function-syntax">Routines::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="4-rart.html#SP20" class="function-link"><span class="function-syntax">RTRelations::add_term_as_call_parameter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">par1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-rart.html#SP20" class="function-link"><span class="function-syntax">RTRelations::add_term_as_call_parameter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">par2</span><span class="plain-syntax">);</span>
@ -2061,7 +2061,7 @@ matches the specific necessary kind of object if there is one.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTRelations::add_term_as_call_parameter</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">RTRelations::add_term_as_call_parameter</span></span>:<br/><a href="4-rart.html#SP19">&#167;19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTRelations::add_term_as_call_parameter</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">RTRelations::add_term_as_call_parameter</span></span>:<br/><a href="4-rart.html#SP19">&#167;19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">bptd</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BPTerms::kind</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">bptd</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PK</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>

View file

@ -108,9 +108,9 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rcd</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::stack_frame</span><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::stack_frame</span><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">R</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">defn_as_I7_source</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">defn_as_I7_source</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">stack_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">defn_as_I7_source</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">id_stack_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTRules::prepare_rule</span><span class="plain-syntax">(</span><span class="identifier-syntax">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
@ -862,16 +862,18 @@ code are the real outcome of the code in this section.
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTRules::rulebook_var_creators</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="identifier-syntax">rulebook</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">StackedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::compile_frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">SharedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::set_frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="4-rls.html#SP12" class="function-link"><span class="function-syntax">RTRules::get_stv_creator_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP4" class="function-link"><span class="function-syntax">RTVariables::compile_frame_creator</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">global_compilation_settings</span><span class="plain-syntax">.</span><span class="identifier-syntax">memory_economy_in_force</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RULEBOOK_VAR_CREATORS_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::named_array_begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="identifier-syntax">rulebook</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">StackedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">)) </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_iname_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">StackedVariables::frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">SharedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">)) </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_iname_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SharedVariables::frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
@ -895,7 +897,7 @@ code are the real outcome of the code in this section.
<span class="plain-syntax"> </span><span class="identifier-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="identifier-syntax">rulebook</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">StackedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">SharedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">my_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">CASE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">));</span>

View file

@ -180,7 +180,7 @@ chosen), but no problem message has been issued about this, or
<span class="plain-syntax"> </span><span class="identifier-syntax">Holsters::to_val_mode</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), &amp;</span><span class="identifier-syntax">VH</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::compile_default_value_vh</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">RTKinds::compile_default_value_vh</span></span>:<br/>Variables - <a href="4-vrb.html#SP6_1">&#167;6.1</a><br/>Properties - <a href="4-prp.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::compile_default_value_vh</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">RTKinds::compile_default_value_vh</span></span>:<br/>Variables - <a href="4-vrb.html#SP7_1">&#167;7.1</a><br/>Properties - <a href="4-prp.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">storage_name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsfk.html#SP5_3" class="named-paragraph-link"><span class="named-paragraph">"Value" is too vague to be the kind of a variable</span><span class="named-paragraph-number">5.3</span></a></span><span class="plain-syntax">;</span>
@ -476,10 +476,12 @@ data, not merely the pointer to them, which is a "deep copy".
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Constructors::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Constructors::allow_word_as_pointer</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::add_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::base_construction</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"*=-BlkValueCompare(*1, BlkValueCast(*##, *#2, *!2))==0"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Frames::pall_get_expanded_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">local_block_value</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::allocate_local_block_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::base_construction</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">promotion</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">promotion</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-BlkValueCompare(*1, BlkValueCast(%S, *#2, *!2))==0"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">to_refer</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">prototype</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">promotion</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -508,29 +510,6 @@ data, not merely the pointer to them, which is a "deep copy".
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::cast_call</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-rsfk.html#SP9" class="function-link"><span class="function-syntax">RTKinds::cast_possible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::Behaviour::get_name_in_template_code</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">)) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"("</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"("</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S_to_%S("</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Behaviour::get_name_in_template_code</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Behaviour::get_name_in_template_code</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::compile_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">","</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::emit_cast_call</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">down</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-rsfk.html#SP9" class="function-link"><span class="function-syntax">RTKinds::cast_possible</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::Behaviour::get_name_in_template_code</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">)) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
@ -550,7 +529,7 @@ data, not merely the pointer to them, which is a "deep copy".
<span class="plain-syntax"> *</span><span class="identifier-syntax">down</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::emit_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::emit_new_local_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -1041,7 +1020,7 @@ list of 20 texts. For the cases above, it's always 1.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">stack_offset</span><span class="plain-syntax">;</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">heap_allocation</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">heap_allocation</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::make_heap_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">multiplier</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">heap_allocation</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::make_heap_allocation</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">RTKinds::make_heap_allocation</span></span>:<br/>Variables - <a href="4-vrb.html#SP4_1">&#167;4.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">multiplier</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">stack_offset</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"unable to allocate heap storage for this kind of value"</span><span class="plain-syntax">);</span>
@ -1059,7 +1038,7 @@ list of 20 texts. For the cases above, it's always 1.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ha</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::emit_heap_allocation</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">RTKinds::emit_heap_allocation</span></span>:<br/>Routines - <a href="4-rtn.html#SP5_1_2">&#167;5.1.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">heap_allocation</span><span class="plain-syntax"> </span><span class="identifier-syntax">ha</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::emit_heap_allocation</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">RTKinds::emit_heap_allocation</span></span>:<br/>Variables - <a href="4-vrb.html#SP4_1">&#167;4.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">heap_allocation</span><span class="plain-syntax"> </span><span class="identifier-syntax">ha</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ha</span><span class="plain-syntax">.</span><span class="identifier-syntax">stack_offset</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">BLKVALUECREATEONSTACK_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
@ -1086,7 +1065,7 @@ list of 20 texts. For the cases above, it's always 1.
<span class="definition-keyword">define</span> <span class="constant-syntax">BLK_FLAG_TRUNCMULT</span><span class="plain-syntax"> </span><span class="constant-syntax">0x00000010</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::emit_block_value_header</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">RTKinds::emit_block_value_header</span></span>:<br/><a href="4-rsfk.html#SP5">&#167;5</a><br/>Constant Lists - <a href="4-cl.html#SP2_1">&#167;2.1</a>, <a href="4-cl.html#SP3">&#167;3</a><br/>Relations at Run Time - <a href="4-rart.html#SP4_1">&#167;4.1</a>, <a href="4-rart.html#SP5">&#167;5</a><br/>Action Patterns - <a href="5-ap.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">individual</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::emit_block_value_header</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">RTKinds::emit_block_value_header</span></span>:<br/><a href="4-rsfk.html#SP5">&#167;5</a><br/>Constant Lists - <a href="4-cl.html#SP2_1">&#167;2.1</a>, <a href="4-cl.html#SP3">&#167;3</a><br/>Relations at Run Time - <a href="4-rart.html#SP4_1">&#167;4.1</a>, <a href="4-rart.html#SP5">&#167;5</a><br/>Action Patterns - <a href="5-ap.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">individual</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">individual</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="identifier-syntax">w</span><span class="plain-syntax"> = </span><span class="constant-syntax">4</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TargetVMs::is_16_bit</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::vm</span><span class="plain-syntax">())) </span><span class="identifier-syntax">w</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
@ -1108,7 +1087,7 @@ each such kind, and needed at run-time.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::base_represented_in_inter</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">RTKinds::base_represented_in_inter</span></span>:<br/><a href="4-rsfk.html#SP25">&#167;25</a>, <a href="4-rsfk.html#SP26">&#167;26</a>, <a href="4-rsfk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::base_represented_in_inter</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">RTKinds::base_represented_in_inter</span></span>:<br/><a href="4-rsfk.html#SP25">&#167;25</a>, <a href="4-rsfk.html#SP26">&#167;26</a>, <a href="4-rsfk.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Kinds::Behaviour::is_kind_of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::is_proper_constructor</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> != </span><span class="identifier-syntax">K_void</span><span class="plain-syntax">) &amp;&amp;</span>
@ -1129,7 +1108,7 @@ each such kind, and needed at run-time.
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_KIND_ARITY</span><span class="plain-syntax"> </span><span class="constant-syntax">32</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKinds::iname</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">RTKinds::iname</span></span>:<br/><a href="4-rsfk.html#SP3">&#167;3</a>, <a href="4-rsfk.html#SP27">&#167;27</a><br/>Emit Property Values - <a href="4-epv.html#SP1">&#167;1</a><br/>Instance Counting - <a href="4-ic.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKinds::iname</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">RTKinds::iname</span></span>:<br/><a href="4-rsfk.html#SP3">&#167;3</a>, <a href="4-rsfk.html#SP27">&#167;27</a><br/>Emit Property Values - <a href="4-epv.html#SP1">&#167;1</a><br/>Instance Counting - <a href="4-ic.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-rsfk.html#SP24" class="function-link"><span class="function-syntax">RTKinds::base_represented_in_inter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_interaction</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KI</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">KI</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_interaction</span><span class="plain-syntax">)</span>
@ -1241,7 +1220,7 @@ each such kind, and needed at run-time.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">object_kind_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKinds::iname_inner</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">RTKinds::iname_inner</span></span>:<br/><a href="4-rsfk.html#SP25">&#167;25</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKinds::iname_inner</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">RTKinds::iname_inner</span></span>:<br/><a href="4-rsfk.html#SP25">&#167;25</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::is_proper_constructor</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-rsfk.html#SP26" class="function-link"><span class="function-syntax">RTKinds::constructed_kind_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
@ -1251,7 +1230,7 @@ each such kind, and needed at run-time.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKinds::assure_iname_exists</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">RTKinds::assure_iname_exists</span></span>:<br/>Noun Identifiers - <a href="4-ni.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTKinds::assure_iname_exists</span><button class="popup" onclick="togglePopup('usagePopup26')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup26">Usage of <span class="code-font"><span class="function-syntax">RTKinds::assure_iname_exists</span></span>:<br/>Noun Identifiers - <a href="4-ni.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">noun</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::Behaviour::get_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-ni.html#SP1" class="function-link"><span class="function-syntax">NounIdentifiers::iname_set</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
@ -1309,7 +1288,7 @@ each such kind, and needed at run-time.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::compile_nnci</span><button class="popup" onclick="togglePopup('usagePopup26')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup26">Usage of <span class="code-font"><span class="function-syntax">RTKinds::compile_nnci</span></span>:<br/><a href="4-rsfk.html#SP21_1">&#167;21.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::compile_nnci</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">RTKinds::compile_nnci</span></span>:<br/><a href="4-rsfk.html#SP21_1">&#167;21.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::named_numeric_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -1335,11 +1314,9 @@ each such kind, and needed at run-time.
<span class="plain-syntax"> </span><a href="4-rsfk.html#SP27" class="function-link"><span class="function-syntax">RTKinds::compile_nnci</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">CCOUNT_BINARY_PREDICATE_HL</span><span class="plain-syntax">), </span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_predicate</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="4-rsfk.html#SP27" class="function-link"><span class="function-syntax">RTKinds::compile_nnci</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">CCOUNT_PROPERTY_HL</span><span class="plain-syntax">), </span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="identifier-syntax">property</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><a href="4-rsfk.html#SP27" class="function-link"><span class="function-syntax">RTKinds::compile_nnci</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">CCOUNT_ACTION_NAME_HL</span><span class="plain-syntax">), </span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="identifier-syntax">action_name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><a href="4-rsfk.html#SP27" class="function-link"><span class="function-syntax">RTKinds::compile_nnci</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">CCOUNT_QUOTATIONS_HL</span><span class="plain-syntax">), </span><a href="4-tl.html#SP11" class="function-link"><span class="function-syntax">TextLiterals::CCOUNT_QUOTATIONS</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><a href="4-rsfk.html#SP27" class="function-link"><span class="function-syntax">RTKinds::compile_nnci</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">MAX_FRAME_SIZE_NEEDED_HL</span><span class="plain-syntax">), </span><span class="identifier-syntax">max_frame_size_needed</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-rsfk.html#SP27" class="function-link"><span class="function-syntax">RTKinds::compile_nnci</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">MAX_FRAME_SIZE_NEEDED_HL</span><span class="plain-syntax">), </span><span class="identifier-syntax">SharedVariables::size_of_largest_set</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><a href="4-rsfk.html#SP27" class="function-link"><span class="function-syntax">RTKinds::compile_nnci</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RNG_SEED_AT_START_OF_PLAY_HL</span><span class="plain-syntax">), </span><span class="identifier-syntax">Task::rng_seed</span><span class="plain-syntax">());</span>
<span class="plain-syntax">}</span>
@ -2243,7 +2220,7 @@ and it seems best to reject the extra complexity needed.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::check_can_have_property</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">RTKinds::check_can_have_property</span></span>:<br/><a href="4-rsfk.html#SP31">&#167;31</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTKinds::check_can_have_property</span><button class="popup" onclick="togglePopup('usagePopup28')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup28">Usage of <span class="code-font"><span class="function-syntax">RTKinds::check_can_have_property</span></span>:<br/><a href="4-rsfk.html#SP31">&#167;31</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::definite</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">;</span>

View file

@ -82,7 +82,7 @@ that rule. This enables them to be manipulated or changed.
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">responding_rule</span><span class="plain-syntax">; </span><span class="comment-syntax"> named rule in which this response occurs</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">response_marker</span><span class="plain-syntax">; </span><span class="comment-syntax"> 0 for A, 1 for B, and so on up</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">original_text</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">original_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">original_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">constant_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp_package</span><span class="plain-syntax">;</span>
@ -140,7 +140,7 @@ but also (in most cases) a <span class="extract"><span class="extract-syntax">TX
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="function-syntax">Strings::response_cue</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Strings::response_cue</span></span>:<br/><a href="4-rsp.html#SP11_1_1">&#167;11.1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owner</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">via_I6</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">via_I6</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">response_message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">original_stack_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::boxed_frame</span><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">responding_rule</span><span class="plain-syntax"> = </span><span class="identifier-syntax">owner</span><span class="plain-syntax">;</span>
@ -545,7 +545,7 @@ divided up by the extensions containing the rules which produce them.
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Strings::frame_for_response</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Strings::frame_for_response</span></span>:<br/>Text Substitutions - <a href="4-ts.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Strings::frame_for_response</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Strings::frame_for_response</span></span>:<br/>Text Substitutions - <a href="4-ts.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">original_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -671,7 +671,7 @@ text needs to be printed in a particular way.
<span class="plain-syntax"> </span><span class="string-syntax">"some text as a response, then it can only occur once in its rule."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">downs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalVariables::emit_storage</span><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> =</span>

View file

@ -89,7 +89,7 @@ already been set up, or not. Here's not:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="function-syntax">Routines::begin</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Routines::begin</span></span>:<br/>List Together - <a href="4-lt.html#SP3_1">&#167;3.1</a><br/>Text Literals - <a href="4-tl.html#SP13_2">&#167;13.2</a><br/>Text Substitutions - <a href="4-ts.html#SP11">&#167;11</a><br/>Responses - <a href="4-rsp.html#SP5_1">&#167;5.1</a>, <a href="4-rsp.html#SP5_2">&#167;5.2</a>, <a href="4-rsp.html#SP6_2">&#167;6.2</a><br/>Rules - <a href="4-rls.html#SP3_1">&#167;3.1</a>, <a href="4-rls.html#SP5">&#167;5</a>, <a href="4-rls.html#SP7">&#167;7</a>, <a href="4-rls.html#SP8_1_1">&#167;8.1.1</a>, <a href="4-rls.html#SP12_1">&#167;12.1</a>, <a href="4-rls.html#SP14">&#167;14</a><br/>Equations Support - <a href="4-es.html#SP1">&#167;1</a><br/>Test Scripts - <a href="4-ts2.html#SP3">&#167;3</a><br/>Internal Test Cases - <a href="4-itc.html#SP4">&#167;4</a><br/>Use Options at Run Time - <a href="4-uoart.html#SP1_1">&#167;1.1</a>, <a href="4-uoart.html#SP1_2">&#167;1.2</a><br/>Variables - <a href="4-vrb.html#SP5_1">&#167;5.1</a><br/>Measurements - <a href="4-msr.html#SP1">&#167;1</a><br/>Adjectives - <a href="4-adj.html#SP3_2">&#167;3.2</a>, <a href="4-adj.html#SP5">&#167;5</a><br/>Runtime Support for Kinds - <a href="4-rsfk.html#SP19_3">&#167;19.3</a>, <a href="4-rsfk.html#SP27_1">&#167;27.1</a>, <a href="4-rsfk.html#SP27_2">&#167;27.2</a>, <a href="4-rsfk.html#SP27_3">&#167;27.3</a>, <a href="4-rsfk.html#SP27_4">&#167;27.4</a>, <a href="4-rsfk.html#SP27_5">&#167;27.5</a>, <a href="4-rsfk.html#SP27_6_1">&#167;27.6.1</a>, <a href="4-rsfk.html#SP27_6_2">&#167;27.6.2</a>, <a href="4-rsfk.html#SP27_6_3">&#167;27.6.3</a>, <a href="4-rsfk.html#SP27_6_4">&#167;27.6.4</a>, <a href="4-rsfk.html#SP27_6_5">&#167;27.6.5</a>, <a href="4-rsfk.html#SP27_6_6">&#167;27.6.6</a>, <a href="4-rsfk.html#SP28">&#167;28</a><br/>Extension Files at Run Time - <a href="4-efart.html#SP1">&#167;1</a><br/>Verbs at Run Time - <a href="4-vart.html#SP4_1">&#167;4.1</a>, <a href="4-vart.html#SP4_2">&#167;4.2</a><br/>Relations at Run Time - <a href="4-rart.html#SP4">&#167;4</a>, <a href="4-rart.html#SP4_2">&#167;4.2</a>, <a href="4-rart.html#SP6">&#167;6</a>, <a href="4-rart.html#SP18_1">&#167;18.1</a>, <a href="4-rart.html#SP18_2">&#167;18.2</a>, <a href="4-rart.html#SP18_3">&#167;18.3</a>, <a href="4-rart.html#SP18_4">&#167;18.4</a>, <a href="4-rart.html#SP18_5">&#167;18.5</a>, <a href="4-rart.html#SP18_6">&#167;18.6</a>, <a href="4-rart.html#SP19">&#167;19</a>, <a href="4-rart.html#SP23">&#167;23</a><br/>Literal Patterns at Run Time - <a href="4-lpart.html#SP2">&#167;2</a><br/>Runtime Support for Tables - <a href="4-rsft.html#SP2">&#167;2</a>, <a href="4-rsft.html#SP5">&#167;5</a><br/>Phrase Requests - <a href="4-pr.html#SP9">&#167;9</a><br/>Phrases as Values - <a href="4-cls.html#SP3_2">&#167;3.2</a><br/>Naming - <a href="5-nmn.html#SP2">&#167;2</a><br/>Backdrops - <a href="5-bck.html#SP2_1">&#167;2.1</a>, <a href="5-bck.html#SP2_2">&#167;2.2</a><br/>Regions - <a href="5-rgn.html#SP2">&#167;2</a><br/>The Map - <a href="5-tm.html#SP4">&#167;4</a><br/>Showme Command - <a href="5-sc.html#SP2">&#167;2</a><br/>Scenes - <a href="5-scn.html#SP2">&#167;2</a>, <a href="5-scn.html#SP6">&#167;6</a><br/>Actions - <a href="5-act.html#SP2">&#167;2</a><br/>Looping Over Scope - <a href="5-los.html#SP2_1">&#167;2.1</a><br/>Named Action Patterns - <a href="5-nap.html#SP1">&#167;1</a><br/>Command Grammars - <a href="5-cg.html#SP7">&#167;7</a><br/>Command Grammar Lines - <a href="5-cgl.html#SP2">&#167;2</a>, <a href="5-cgl.html#SP8">&#167;8</a><br/>Noun Filter Tokens - <a href="5-nft.html#SP2">&#167;2</a><br/>Tokens Parsing Values - <a href="5-tpv.html#SP1">&#167;1</a><br/>General Parsing Routines - <a href="5-gpr.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="function-syntax">Routines::begin</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Routines::begin</span></span>:<br/>List Together - <a href="4-lt.html#SP3_1">&#167;3.1</a><br/>Text Literals - <a href="4-tl.html#SP13_2">&#167;13.2</a><br/>Text Substitutions - <a href="4-ts.html#SP11">&#167;11</a><br/>Responses - <a href="4-rsp.html#SP5_1">&#167;5.1</a>, <a href="4-rsp.html#SP5_2">&#167;5.2</a>, <a href="4-rsp.html#SP6_2">&#167;6.2</a><br/>Rules - <a href="4-rls.html#SP3_1">&#167;3.1</a>, <a href="4-rls.html#SP5">&#167;5</a>, <a href="4-rls.html#SP7">&#167;7</a>, <a href="4-rls.html#SP8_1_1">&#167;8.1.1</a>, <a href="4-rls.html#SP12_1">&#167;12.1</a>, <a href="4-rls.html#SP14">&#167;14</a><br/>Equations Support - <a href="4-es.html#SP1">&#167;1</a><br/>Test Scripts - <a href="4-ts2.html#SP3">&#167;3</a><br/>Internal Test Cases - <a href="4-itc.html#SP4">&#167;4</a><br/>Use Options at Run Time - <a href="4-uoart.html#SP1_1">&#167;1.1</a>, <a href="4-uoart.html#SP1_2">&#167;1.2</a><br/>Variables - <a href="4-vrb.html#SP4">&#167;4</a>, <a href="4-vrb.html#SP6_1">&#167;6.1</a><br/>Measurements - <a href="4-msr.html#SP1">&#167;1</a><br/>Adjectives - <a href="4-adj.html#SP3_2">&#167;3.2</a>, <a href="4-adj.html#SP5">&#167;5</a><br/>Runtime Support for Kinds - <a href="4-rsfk.html#SP19_3">&#167;19.3</a>, <a href="4-rsfk.html#SP27_1">&#167;27.1</a>, <a href="4-rsfk.html#SP27_2">&#167;27.2</a>, <a href="4-rsfk.html#SP27_3">&#167;27.3</a>, <a href="4-rsfk.html#SP27_4">&#167;27.4</a>, <a href="4-rsfk.html#SP27_5">&#167;27.5</a>, <a href="4-rsfk.html#SP27_6_1">&#167;27.6.1</a>, <a href="4-rsfk.html#SP27_6_2">&#167;27.6.2</a>, <a href="4-rsfk.html#SP27_6_3">&#167;27.6.3</a>, <a href="4-rsfk.html#SP27_6_4">&#167;27.6.4</a>, <a href="4-rsfk.html#SP27_6_5">&#167;27.6.5</a>, <a href="4-rsfk.html#SP27_6_6">&#167;27.6.6</a>, <a href="4-rsfk.html#SP28">&#167;28</a><br/>Extension Files at Run Time - <a href="4-efart.html#SP1">&#167;1</a><br/>Verbs at Run Time - <a href="4-vart.html#SP4_1">&#167;4.1</a>, <a href="4-vart.html#SP4_2">&#167;4.2</a><br/>Relations at Run Time - <a href="4-rart.html#SP4">&#167;4</a>, <a href="4-rart.html#SP4_2">&#167;4.2</a>, <a href="4-rart.html#SP6">&#167;6</a>, <a href="4-rart.html#SP18_1">&#167;18.1</a>, <a href="4-rart.html#SP18_2">&#167;18.2</a>, <a href="4-rart.html#SP18_3">&#167;18.3</a>, <a href="4-rart.html#SP18_4">&#167;18.4</a>, <a href="4-rart.html#SP18_5">&#167;18.5</a>, <a href="4-rart.html#SP18_6">&#167;18.6</a>, <a href="4-rart.html#SP19">&#167;19</a>, <a href="4-rart.html#SP23">&#167;23</a><br/>Literal Patterns at Run Time - <a href="4-lpart.html#SP2">&#167;2</a><br/>Runtime Support for Tables - <a href="4-rsft.html#SP2">&#167;2</a>, <a href="4-rsft.html#SP5">&#167;5</a><br/>Phrase Requests - <a href="4-pr.html#SP9">&#167;9</a><br/>Phrases as Values - <a href="4-cls.html#SP3_2">&#167;3.2</a><br/>Naming - <a href="5-nmn.html#SP2">&#167;2</a><br/>Backdrops - <a href="5-bck.html#SP2_1">&#167;2.1</a>, <a href="5-bck.html#SP2_2">&#167;2.2</a><br/>Regions - <a href="5-rgn.html#SP2">&#167;2</a><br/>The Map - <a href="5-tm.html#SP4">&#167;4</a><br/>Showme Command - <a href="5-sc.html#SP2">&#167;2</a><br/>Scenes - <a href="5-scn.html#SP2">&#167;2</a>, <a href="5-scn.html#SP6">&#167;6</a><br/>Actions - <a href="5-act.html#SP2">&#167;2</a><br/>Looping Over Scope - <a href="5-los.html#SP2_1">&#167;2.1</a><br/>Named Action Patterns - <a href="5-nap.html#SP1">&#167;1</a><br/>Command Grammars - <a href="5-cg.html#SP7">&#167;7</a><br/>Command Grammar Lines - <a href="5-cgl.html#SP2">&#167;2</a>, <a href="5-cgl.html#SP8">&#167;8</a><br/>Noun Filter Tokens - <a href="5-nft.html#SP2">&#167;2</a><br/>Tokens Parsing Values - <a href="5-tpv.html#SP1">&#167;1</a><br/>General Parsing Routines - <a href="5-gpr.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-rtn.html#SP4" class="function-link"><span class="function-syntax">Routines::begin_framed</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
@ -98,7 +98,7 @@ we need to keep track of:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> the stack frame for this routine</span>
<span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> the stack frame for this routine</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">currently_compiling_nnp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="comment-syntax"> is this a nonphrasal stack frame we made ourselves?</span>
<span class="identifier-syntax">inter_package</span><span class="plain-syntax"> *</span><span class="identifier-syntax">currently_compiling_inter_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> where Inter is being emitted to</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">currently_compiling_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> routine we end up with</span>
@ -108,7 +108,7 @@ pre-existing stack frame:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="function-syntax">Routines::begin_framed</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Routines::begin_framed</span></span>:<br/><a href="4-rtn.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="function-syntax">Routines::begin_framed</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Routines::begin_framed</span></span>:<br/><a href="4-rtn.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no iname for routine"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">currently_compiling_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">iname</span><span class="plain-syntax">;</span>
@ -148,11 +148,11 @@ did not.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Routines::end</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Routines::end</span></span>:<br/>List Together - <a href="4-lt.html#SP3_1">&#167;3.1</a><br/>Text Literals - <a href="4-tl.html#SP13_2">&#167;13.2</a><br/>Text Substitutions - <a href="4-ts.html#SP11">&#167;11</a><br/>Responses - <a href="4-rsp.html#SP5_1">&#167;5.1</a>, <a href="4-rsp.html#SP5_2">&#167;5.2</a>, <a href="4-rsp.html#SP6_2">&#167;6.2</a><br/>Rules - <a href="4-rls.html#SP3_1">&#167;3.1</a>, <a href="4-rls.html#SP5">&#167;5</a>, <a href="4-rls.html#SP7">&#167;7</a>, <a href="4-rls.html#SP8_1_5">&#167;8.1.5</a>, <a href="4-rls.html#SP12_1">&#167;12.1</a>, <a href="4-rls.html#SP14">&#167;14</a><br/>Equations Support - <a href="4-es.html#SP1">&#167;1</a><br/>Test Scripts - <a href="4-ts2.html#SP3">&#167;3</a><br/>Internal Test Cases - <a href="4-itc.html#SP4">&#167;4</a><br/>Use Options at Run Time - <a href="4-uoart.html#SP1_1">&#167;1.1</a>, <a href="4-uoart.html#SP1_2">&#167;1.2</a><br/>Variables - <a href="4-vrb.html#SP5_1">&#167;5.1</a><br/>Measurements - <a href="4-msr.html#SP1">&#167;1</a><br/>Adjectives - <a href="4-adj.html#SP3_2">&#167;3.2</a>, <a href="4-adj.html#SP5">&#167;5</a><br/>Runtime Support for Kinds - <a href="4-rsfk.html#SP19_3">&#167;19.3</a>, <a href="4-rsfk.html#SP27_1">&#167;27.1</a>, <a href="4-rsfk.html#SP27_2">&#167;27.2</a>, <a href="4-rsfk.html#SP27_3">&#167;27.3</a>, <a href="4-rsfk.html#SP27_4">&#167;27.4</a>, <a href="4-rsfk.html#SP27_5">&#167;27.5</a>, <a href="4-rsfk.html#SP27_6_1">&#167;27.6.1</a>, <a href="4-rsfk.html#SP27_6_2">&#167;27.6.2</a>, <a href="4-rsfk.html#SP27_6_3">&#167;27.6.3</a>, <a href="4-rsfk.html#SP27_6_4">&#167;27.6.4</a>, <a href="4-rsfk.html#SP27_6_5">&#167;27.6.5</a>, <a href="4-rsfk.html#SP27_6_6">&#167;27.6.6</a>, <a href="4-rsfk.html#SP28">&#167;28</a><br/>Extension Files at Run Time - <a href="4-efart.html#SP1">&#167;1</a><br/>Verbs at Run Time - <a href="4-vart.html#SP4_1">&#167;4.1</a>, <a href="4-vart.html#SP4_2">&#167;4.2</a><br/>Relations at Run Time - <a href="4-rart.html#SP4">&#167;4</a>, <a href="4-rart.html#SP4_2">&#167;4.2</a>, <a href="4-rart.html#SP6">&#167;6</a>, <a href="4-rart.html#SP18_1">&#167;18.1</a>, <a href="4-rart.html#SP18_2">&#167;18.2</a>, <a href="4-rart.html#SP18_3">&#167;18.3</a>, <a href="4-rart.html#SP18_4">&#167;18.4</a>, <a href="4-rart.html#SP18_5">&#167;18.5</a>, <a href="4-rart.html#SP18_6">&#167;18.6</a>, <a href="4-rart.html#SP19">&#167;19</a>, <a href="4-rart.html#SP23">&#167;23</a><br/>Literal Patterns at Run Time - <a href="4-lpart.html#SP2">&#167;2</a><br/>Runtime Support for Tables - <a href="4-rsft.html#SP2">&#167;2</a>, <a href="4-rsft.html#SP5">&#167;5</a><br/>Phrase Requests - <a href="4-pr.html#SP9">&#167;9</a><br/>Phrases as Values - <a href="4-cls.html#SP3_2">&#167;3.2</a><br/>Naming - <a href="5-nmn.html#SP2">&#167;2</a><br/>Backdrops - <a href="5-bck.html#SP2_1">&#167;2.1</a>, <a href="5-bck.html#SP2_2">&#167;2.2</a><br/>Regions - <a href="5-rgn.html#SP2">&#167;2</a><br/>The Map - <a href="5-tm.html#SP4">&#167;4</a><br/>Showme Command - <a href="5-sc.html#SP2">&#167;2</a><br/>Scenes - <a href="5-scn.html#SP2">&#167;2</a>, <a href="5-scn.html#SP6">&#167;6</a><br/>Actions - <a href="5-act.html#SP2">&#167;2</a><br/>Looping Over Scope - <a href="5-los.html#SP2_1">&#167;2.1</a><br/>Named Action Patterns - <a href="5-nap.html#SP1">&#167;1</a><br/>Command Grammars - <a href="5-cg.html#SP7">&#167;7</a><br/>Command Grammar Lines - <a href="5-cgl.html#SP2">&#167;2</a>, <a href="5-cgl.html#SP8">&#167;8</a><br/>Noun Filter Tokens - <a href="5-nft.html#SP2">&#167;2</a><br/>Tokens Parsing Values - <a href="5-tpv.html#SP1">&#167;1</a><br/>General Parsing Routines - <a href="5-gpr.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Routines::end</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Routines::end</span></span>:<br/>List Together - <a href="4-lt.html#SP3_1">&#167;3.1</a><br/>Text Literals - <a href="4-tl.html#SP13_2">&#167;13.2</a><br/>Text Substitutions - <a href="4-ts.html#SP11">&#167;11</a><br/>Responses - <a href="4-rsp.html#SP5_1">&#167;5.1</a>, <a href="4-rsp.html#SP5_2">&#167;5.2</a>, <a href="4-rsp.html#SP6_2">&#167;6.2</a><br/>Rules - <a href="4-rls.html#SP3_1">&#167;3.1</a>, <a href="4-rls.html#SP5">&#167;5</a>, <a href="4-rls.html#SP7">&#167;7</a>, <a href="4-rls.html#SP8_1_5">&#167;8.1.5</a>, <a href="4-rls.html#SP12_1">&#167;12.1</a>, <a href="4-rls.html#SP14">&#167;14</a><br/>Equations Support - <a href="4-es.html#SP1">&#167;1</a><br/>Test Scripts - <a href="4-ts2.html#SP3">&#167;3</a><br/>Internal Test Cases - <a href="4-itc.html#SP4">&#167;4</a><br/>Use Options at Run Time - <a href="4-uoart.html#SP1_1">&#167;1.1</a>, <a href="4-uoart.html#SP1_2">&#167;1.2</a><br/>Variables - <a href="4-vrb.html#SP4">&#167;4</a>, <a href="4-vrb.html#SP6_1">&#167;6.1</a><br/>Measurements - <a href="4-msr.html#SP1">&#167;1</a><br/>Adjectives - <a href="4-adj.html#SP3_2">&#167;3.2</a>, <a href="4-adj.html#SP5">&#167;5</a><br/>Runtime Support for Kinds - <a href="4-rsfk.html#SP19_3">&#167;19.3</a>, <a href="4-rsfk.html#SP27_1">&#167;27.1</a>, <a href="4-rsfk.html#SP27_2">&#167;27.2</a>, <a href="4-rsfk.html#SP27_3">&#167;27.3</a>, <a href="4-rsfk.html#SP27_4">&#167;27.4</a>, <a href="4-rsfk.html#SP27_5">&#167;27.5</a>, <a href="4-rsfk.html#SP27_6_1">&#167;27.6.1</a>, <a href="4-rsfk.html#SP27_6_2">&#167;27.6.2</a>, <a href="4-rsfk.html#SP27_6_3">&#167;27.6.3</a>, <a href="4-rsfk.html#SP27_6_4">&#167;27.6.4</a>, <a href="4-rsfk.html#SP27_6_5">&#167;27.6.5</a>, <a href="4-rsfk.html#SP27_6_6">&#167;27.6.6</a>, <a href="4-rsfk.html#SP28">&#167;28</a><br/>Extension Files at Run Time - <a href="4-efart.html#SP1">&#167;1</a><br/>Verbs at Run Time - <a href="4-vart.html#SP4_1">&#167;4.1</a>, <a href="4-vart.html#SP4_2">&#167;4.2</a><br/>Relations at Run Time - <a href="4-rart.html#SP4">&#167;4</a>, <a href="4-rart.html#SP4_2">&#167;4.2</a>, <a href="4-rart.html#SP6">&#167;6</a>, <a href="4-rart.html#SP18_1">&#167;18.1</a>, <a href="4-rart.html#SP18_2">&#167;18.2</a>, <a href="4-rart.html#SP18_3">&#167;18.3</a>, <a href="4-rart.html#SP18_4">&#167;18.4</a>, <a href="4-rart.html#SP18_5">&#167;18.5</a>, <a href="4-rart.html#SP18_6">&#167;18.6</a>, <a href="4-rart.html#SP19">&#167;19</a>, <a href="4-rart.html#SP23">&#167;23</a><br/>Literal Patterns at Run Time - <a href="4-lpart.html#SP2">&#167;2</a><br/>Runtime Support for Tables - <a href="4-rsft.html#SP2">&#167;2</a>, <a href="4-rsft.html#SP5">&#167;5</a><br/>Phrase Requests - <a href="4-pr.html#SP9">&#167;9</a><br/>Phrases as Values - <a href="4-cls.html#SP3_2">&#167;3.2</a><br/>Naming - <a href="5-nmn.html#SP2">&#167;2</a><br/>Backdrops - <a href="5-bck.html#SP2_1">&#167;2.1</a>, <a href="5-bck.html#SP2_2">&#167;2.2</a><br/>Regions - <a href="5-rgn.html#SP2">&#167;2</a><br/>The Map - <a href="5-tm.html#SP4">&#167;4</a><br/>Showme Command - <a href="5-sc.html#SP2">&#167;2</a><br/>Scenes - <a href="5-scn.html#SP2">&#167;2</a>, <a href="5-scn.html#SP6">&#167;6</a><br/>Actions - <a href="5-act.html#SP2">&#167;2</a><br/>Looping Over Scope - <a href="5-los.html#SP2_1">&#167;2.1</a><br/>Named Action Patterns - <a href="5-nap.html#SP1">&#167;1</a><br/>Command Grammars - <a href="5-cg.html#SP7">&#167;7</a><br/>Command Grammar Lines - <a href="5-cgl.html#SP2">&#167;2</a>, <a href="5-cgl.html#SP8">&#167;8</a><br/>Noun Filter Tokens - <a href="5-nft.html#SP2">&#167;2</a><br/>Tokens Parsing Values - <a href="5-tpv.html#SP1">&#167;1</a><br/>General Parsing Routines - <a href="5-gpr.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalVariables::deduced_function_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kernel_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">public_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">currently_compiling_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocated_pointers</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Frames::uses_local_block_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">no_formal_parameters_needed</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kernel_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Produce::kernel</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">public_name</span><span class="plain-syntax">);</span>
@ -185,7 +185,6 @@ did not.
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_package</span><span class="plain-syntax"> *</span><span class="identifier-syntax">block_package</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Produce::block</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">public_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I7RBLK_symbol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rtn.html#SP5_1_1" class="named-paragraph-link"><span class="named-paragraph">Compile I6 locals for the outer shell</span><span class="named-paragraph-number">5.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">NBV</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rtn.html#SP5_1_2" class="named-paragraph-link"><span class="named-paragraph">Compile some setup code to make ready for the kernel</span><span class="named-paragraph-number">5.1.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rtn.html#SP5_1_3" class="named-paragraph-link"><span class="named-paragraph">Compile a call to the kernel</span><span class="named-paragraph-number">5.1.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rtn.html#SP5_1_4" class="named-paragraph-link"><span class="named-paragraph">Compile some teardown code now that the kernel has finished</span><span class="named-paragraph-number">5.1.4</span></a></span><span class="plain-syntax">;</span>
@ -218,23 +217,11 @@ after the call parameters, and is used only as a scratch variable.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::push</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">I7SFRAME_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax">=</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocated_pointers</span><span class="plain-syntax">; </span><span class="identifier-syntax">pall</span><span class="plain-syntax">; </span><span class="identifier-syntax">pall</span><span class="plain-syntax">=</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_in_frame</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">offset_past</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">NBV</span><span class="plain-syntax">) </span><span class="identifier-syntax">NBV</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">offset_past</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">STACKFRAMECREATE_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">NBV</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax">=</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocated_pointers</span><span class="plain-syntax">; </span><span class="identifier-syntax">pall</span><span class="plain-syntax">; </span><span class="identifier-syntax">pall</span><span class="plain-syntax">=</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_in_frame</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="4-rsfk.html#SP22" class="function-link"><span class="function-syntax">RTKinds::emit_heap_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::compile_lbv_setup</span><span class="plain-syntax">(</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;currently_compiling_in_frame-&gt;</span><span class="identifier-syntax">no_formal_parameters_needed</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><a href="4-tv.html#SP3" class="function-link"><span class="function-syntax">RTTemporaryVariables::formal_parameter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::push</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="4-vrb.html#SP4" class="function-link"><span class="function-syntax">RTVariables::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::push</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="4-vrb.html#SP5" class="function-link"><span class="function-syntax">RTVariables::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rtn.html#SP5_1">&#167;5.1</a>.</li></ul>
@ -272,18 +259,9 @@ after the call parameters, and is used only as a scratch variable.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">no_formal_parameters_needed</span><span class="plain-syntax">-1; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&gt;=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">--) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><a href="4-tv.html#SP3" class="function-link"><span class="function-syntax">RTTemporaryVariables::formal_parameter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::pull</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="4-vrb.html#SP4" class="function-link"><span class="function-syntax">RTVariables::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::pull</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="4-vrb.html#SP5" class="function-link"><span class="function-syntax">RTVariables::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax">=</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocated_pointers</span><span class="plain-syntax">; </span><span class="identifier-syntax">pall</span><span class="plain-syntax">; </span><span class="identifier-syntax">pall</span><span class="plain-syntax">=</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_in_frame</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">BLKVALUEFREEONSTACK_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">offset_index</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::pull</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">I7SFRAME_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::compile_lbv_teardown</span><span class="plain-syntax">(</span><span class="identifier-syntax">currently_compiling_in_frame</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rtn.html#SP5_1">&#167;5.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5_1_5" class="paragraph-anchor"></a><b>&#167;5.1.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile a return from the outer shell</span><span class="named-paragraph-number">5.1.5</span></span><span class="comment-syntax"> =</span>

View file

@ -93,7 +93,7 @@ don't exist, and ignore them until they come up later.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">responding_to_marker</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sentence_using_this</span><span class="plain-syntax">; </span><span class="comment-syntax"> where this occurs in source</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">local_names_existed_at_usage_time</span><span class="plain-syntax">; </span><span class="comment-syntax"> remember in case of problems</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parked_stack_frame</span><span class="plain-syntax">; </span><span class="comment-syntax"> for cases where possible</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parked_stack_frame</span><span class="plain-syntax">; </span><span class="comment-syntax"> for cases where possible</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> the I6 array for this</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts_routine_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> the routine to implement it</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ts_sb_needed</span><span class="plain-syntax">; </span><span class="comment-syntax"> reference copy of small block needed as a constant?</span>
@ -137,7 +137,7 @@ to the same routines to print them.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="function-syntax">Strings::TextSubstitutions::new_text_substitution</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Strings::TextSubstitutions::new_text_substitution</span></span>:<br/><a href="4-ts.html#SP7">&#167;7</a>, <a href="4-ts.html#SP7_1">&#167;7.1</a><br/>Responses - <a href="4-rsp.html#SP4">&#167;4</a>, <a href="4-rsp.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">no_further_text_subs</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Panic, because it is really too late</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unsubstituted_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
@ -146,7 +146,7 @@ to the same routines to print them.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parked_stack_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">new_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">new_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parked_stack_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::boxed_frame</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">new_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) </span><span class="identifier-syntax">LocalVariables::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parked_stack_frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
@ -215,7 +215,7 @@ that routine later. This appearance of the routine name is called the "cue".
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">adopted_rule_for_compilation</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Rules::log</span><span class="plain-syntax">(</span><span class="identifier-syntax">adopted_rule_for_compilation</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">adopted_rule_for_compilation</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Write the actual cue</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
@ -227,7 +227,7 @@ that routine later. This appearance of the routine name is called the "cue".
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::boxed_frame</span><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">TEXT_TY_EXPANDIFPERISHABLE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::emit_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::emit_new_local_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP4" class="function-link"><span class="function-syntax">Strings::TextSubstitutions::new_text_substitution</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">adopted_rule_for_compilation</span><span class="plain-syntax">, </span><span class="identifier-syntax">adopted_marker_for_compilation</span><span class="plain-syntax">, </span><a href="2-emt.html#SP4" class="function-link"><span class="function-syntax">Emit::current_enclosure</span></a><span class="plain-syntax">());</span>
@ -361,7 +361,7 @@ compiling it.
<span class="plain-syntax"> </span><span class="identifier-syntax">current_ts_being_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ts</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tr_done_already</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="4-rtn.html#SP2" class="function-link"><span class="function-syntax">Routines::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_routine_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parked_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parked_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_to_rule</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_to_marker</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rules::get_response</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_to_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_to_marker</span><span class="plain-syntax">);</span>

View file

@ -200,7 +200,7 @@ run-time locations to any variable without them:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">RTVariables::get_identifier</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">RTVariables::get_identifier</span></span>:<br/><a href="4-vrb.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">RTVariables::get_identifier</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">RTVariables::get_identifier</span></span>:<br/><a href="4-vrb.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rvalue_nve</span><span class="plain-syntax">.</span><span class="element-syntax">textual_form</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><a href="4-vrb.html#SP4" class="function-link"><span class="function-syntax">RTVariables::allocate_storage</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rvalue_nve</span><span class="plain-syntax">.</span><span class="element-syntax">textual_form</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-vrb.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Issue a missing meaning problem</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">rvalue_nve</span><span class="plain-syntax">.</span><span class="element-syntax">textual_form</span><span class="plain-syntax">;</span>
@ -237,21 +237,112 @@ tp make that decision:
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">nonlocal_variable_emission</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::stv_lvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner_id</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ACTION_PROCESSING_RB</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">offset_in_owning_frame</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">))</span>
<span class="reserved-syntax">nonlocal_variable_emission</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::shv_lvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">SharedVariables::get_owner_id</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) == </span><span class="identifier-syntax">ACTION_PROCESSING_RB</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">SharedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-vrb.html#SP1" class="function-link"><span class="function-syntax">RTVariables::nve_from_iname</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ACTOR_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-vrb.html#SP1" class="function-link"><span class="function-syntax">RTVariables::nve_from_mstack</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">offset_in_owning_frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-vrb.html#SP1" class="function-link"><span class="function-syntax">RTVariables::nve_from_mstack</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SharedVariables::get_owner_id</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">), </span><span class="identifier-syntax">SharedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">nonlocal_variable_emission</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::stv_rvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">stacked_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner_id</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ACTION_PROCESSING_RB</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">offset_in_owning_frame</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">))</span>
<span class="reserved-syntax">nonlocal_variable_emission</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::shv_rvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">SharedVariables::get_owner_id</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) == </span><span class="identifier-syntax">ACTION_PROCESSING_RB</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">SharedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-vrb.html#SP1" class="function-link"><span class="function-syntax">RTVariables::nve_from_iname</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ACTOR_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-vrb.html#SP1" class="function-link"><span class="function-syntax">RTVariables::nve_from_mstack</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owner_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">stv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">offset_in_owning_frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-vrb.html#SP1" class="function-link"><span class="function-syntax">RTVariables::nve_from_mstack</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SharedVariables::get_owner_id</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">), </span><span class="identifier-syntax">SharedVariables::get_offset</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">), </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTVariables::iname</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">RTVariables::iname</span></span>:<br/><a href="4-vrb.html#SP5">&#167;5</a>, <a href="4-vrb.html#SP5_1">&#167;5.1</a><br/>Hierarchy - <a href="2-hrr.html#SP3">&#167;3</a><br/>Routines - <a href="4-rtn.html#SP5_1_2">&#167;5.1.2</a>, <a href="4-rtn.html#SP5_1_4">&#167;5.1.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::compile_frame_creator</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">RTVariables::compile_frame_creator</span></span>:<br/>Rules - <a href="4-rls.html#SP12">&#167;12</a><br/>Activities - <a href="4-act.html#SP2">&#167;2</a><br/>Actions - <a href="5-act.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">set</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="4-rtn.html#SP2" class="function-link"><span class="function-syntax">Routines::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SharedVariables::frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pos_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalVariables::add_named_call_as_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"pos"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalVariables::add_named_call_as_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"state"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">EQ_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">state_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-vrb.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Compile frame creator if state is set</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-vrb.html#SP4_2" class="named-paragraph-link"><span class="named-paragraph">Compile frame creator if state is clear</span><span class="named-paragraph-number">4.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">RETURN_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">count</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><a href="4-rtn.html#SP5" class="function-link"><span class="function-syntax">Routines::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">count</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4_1" class="paragraph-anchor"></a><b>&#167;4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile frame creator if state is set</span><span class="named-paragraph-number">4.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">variables</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">q</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::get_variable</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NonlocalVariables::kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">LOOKUPREF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">MSTACK_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="4-rsfk.html#SP22" class="function-link"><span class="function-syntax">RTKinds::emit_heap_allocation</span></a><span class="plain-syntax">(</span><a href="4-rsfk.html#SP22" class="function-link"><span class="function-syntax">RTKinds::make_heap_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, -1));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::emit_initial_value_as_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">POSTINCREMENT_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-vrb.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4_2" class="paragraph-anchor"></a><b>&#167;4.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile frame creator if state is clear</span><span class="named-paragraph-number">4.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="identifier-syntax">shared_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">variables</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">q</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::get_variable</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NonlocalVariables::kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">BLKVALUEFREE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">LOOKUP_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">MSTACK_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">POSTINCREMENT_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-vrb.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTVariables::iname</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">RTVariables::iname</span></span>:<br/><a href="4-vrb.html#SP6">&#167;6</a>, <a href="4-vrb.html#SP6_1">&#167;6.1</a><br/>Hierarchy - <a href="2-hrr.html#SP3">&#167;3</a><br/>Routines - <a href="4-rtn.html#SP5_1_2">&#167;5.1.2</a>, <a href="4-rtn.html#SP5_1_4">&#167;5.1.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">nlv_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::package</span></a><span class="plain-syntax">(</span><a href="2-cu.html#SP5" class="function-link"><span class="function-syntax">CompilationUnits::find</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nlv_created_at</span><span class="plain-syntax">), </span><span class="constant-syntax">VARIABLES_HAP</span><span class="plain-syntax">);</span>
@ -261,17 +352,17 @@ tp make that decision:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">nlv_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>In extreme cases, it's even possible to set an explicit I6 schema for how
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>In extreme cases, it's even possible to set an explicit I6 schema for how
to change a variable:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::set_write_schema</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">RTVariables::set_write_schema</span></span>:<br/>The Player - <a href="5-tp.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::set_write_schema</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">RTVariables::set_write_schema</span></span>:<br/>The Player - <a href="5-tp.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">nlv_write_schema</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">RTVariables::get_write_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP5" class="function-link"><span class="function-syntax">RTVariables::warn_about_change</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::warn_about_change</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">nlv_write_schema</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -313,7 +404,7 @@ to change a variable:
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nve</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">use_own_iname</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><a href="4-vrb.html#SP4" class="function-link"><span class="function-syntax">RTVariables::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><a href="4-vrb.html#SP5" class="function-link"><span class="function-syntax">RTVariables::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nve</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">nothing_form</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Site::veneer_symbol</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">NOTHING_VSYMB</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
@ -330,10 +421,10 @@ to change a variable:
<span class="plain-syntax"> </span><span class="identifier-syntax">BEGIN_COMPILATION_MODE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_EXIT</span><span class="plain-syntax">(</span><span class="identifier-syntax">DEREFERENCE_POINTERS_CMODE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="4-vrb.html#SP4" class="function-link"><span class="function-syntax">RTVariables::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="4-vrb.html#SP5" class="function-link"><span class="function-syntax">RTVariables::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">END_COMPILATION_MODE</span><span class="plain-syntax">;</span>
@ -341,21 +432,21 @@ to change a variable:
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">housed_in_variables_array</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rvalue</span><span class="plain-syntax"> = </span><a href="4-vrb.html#SP3" class="function-link"><span class="function-syntax">RTVariables::get_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nlv_kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">rvalue</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-vrb.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Add any anomalous extras</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-vrb.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Add any anomalous extras</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>&#167;5.1. </b>Here, an inter routine is compiled which returns the current value of the
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>&#167;6.1. </b>Here, an inter routine is compiled which returns the current value of the
command prompt variable; see <a href="../CommandParserKit/S-prs.html" class="internal">Parser (in CommandParserKit)</a>.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add any anomalous extras</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add any anomalous extras</span><span class="named-paragraph-number">6.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">command_prompt_VAR</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="4-vrb.html#SP4" class="function-link"><span class="function-syntax">RTVariables::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="4-vrb.html#SP5" class="function-link"><span class="function-syntax">RTVariables::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cpt_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">COMMANDPROMPTTEXT_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="4-rtn.html#SP2" class="function-link"><span class="function-syntax">Routines::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cpt_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">RETURN_BIP</span><span class="plain-syntax">);</span>
@ -366,8 +457,8 @@ command prompt variable; see <a href="../CommandParserKit/S-prs.html" class="int
<span class="plain-syntax"> </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">cpt_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-vrb.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>The following routine compiles the correct initial value for the given
<ul class="endnotetexts"><li>This code is used in <a href="4-vrb.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>The following routine compiles the correct initial value for the given
variable. If it has no known initial value, it is given the initial
value for its kind where possible: note that this may not be possible
if the source text says something like
@ -383,24 +474,24 @@ which makes its kind safe. Hence the error messages.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::emit_initial_value</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">RTVariables::emit_initial_value</span></span>:<br/>The Player - <a href="5-tp.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::emit_initial_value</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">RTVariables::emit_initial_value</span></span>:<br/>The Player - <a href="5-tp.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> </span><span class="identifier-syntax">VH</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Holsters::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTER_DATA_VHMODE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::compile_initial_value_vh</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::compile_initial_value_vh</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Holsters::unholster_pair</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_generic_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::emit_initial_value_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::emit_initial_value_as_val</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">RTVariables::emit_initial_value_as_val</span></span>:<br/><a href="4-vrb.html#SP4_1">&#167;4.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> </span><span class="identifier-syntax">VH</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Holsters::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTER_VAL_VHMODE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::compile_initial_value_vh</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::compile_initial_value_vh</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Holsters::to_val_mode</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), &amp;</span><span class="identifier-syntax">VH</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::seek_initial_value</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">RTVariables::seek_initial_value</span></span>:<br/><a href="4-vrb.html#SP5">&#167;5</a><br/>Bibliographic Data - <a href="5-bd.html#SP1_1">&#167;1.1</a>, <a href="5-bd.html#SP1_2">&#167;1.2</a>, <a href="5-bd.html#SP1_3">&#167;1.3</a>, <a href="5-bd.html#SP1_4">&#167;1.4</a><br/>The Score - <a href="5-ts.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> *</span><span class="identifier-syntax">v1</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTVariables::seek_initial_value</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">RTVariables::seek_initial_value</span></span>:<br/><a href="4-vrb.html#SP6">&#167;6</a><br/>Bibliographic Data - <a href="5-bd.html#SP1_1">&#167;1.1</a>, <a href="5-bd.html#SP1_2">&#167;1.2</a>, <a href="5-bd.html#SP1_3">&#167;1.3</a>, <a href="5-bd.html#SP1_4">&#167;1.4</a><br/>The Score - <a href="5-ts.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> *</span><span class="identifier-syntax">v1</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> *</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ival_emission</span><span class="plain-syntax"> </span><span class="identifier-syntax">IE</span><span class="plain-syntax"> = </span><a href="2-emt.html#SP4" class="function-link"><span class="function-syntax">Emit::begin_ival_emission</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::compile_initial_value_vh</span></a><span class="plain-syntax">(</span><a href="2-emt.html#SP4" class="function-link"><span class="function-syntax">Emit::ival_holster</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">IE</span><span class="plain-syntax">), </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::compile_initial_value_vh</span></a><span class="plain-syntax">(</span><a href="2-emt.html#SP4" class="function-link"><span class="function-syntax">Emit::ival_holster</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">IE</span><span class="plain-syntax">), </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP4" class="function-link"><span class="function-syntax">Emit::end_ival_emission</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">IE</span><span class="plain-syntax">, </span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -411,16 +502,16 @@ which makes its kind safe. Hence the error messages.
<span class="plain-syntax"> </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">, </span><span class="identifier-syntax">UNKNOWN_NT</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nlv_created_at</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-vrb.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Initialise with the default value of its kind</span><span class="named-paragraph-number">6.1</span></a></span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-vrb.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Initialise with the default value of its kind</span><span class="named-paragraph-number">7.1</span></a></span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VariableSubjects::origin_of_initial_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Lvalues::get_storage_form</span><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">) == </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-vrb.html#SP6_2" class="named-paragraph-link"><span class="named-paragraph">Issue a problem for one variable set equal to another</span><span class="named-paragraph-number">6.2</span></a></span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-vrb.html#SP7_2" class="named-paragraph-link"><span class="named-paragraph">Issue a problem for one variable set equal to another</span><span class="named-paragraph-number">7.2</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">Specifications::Compiler::compile_constant_to_kind_vh</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nlv_kind</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>&#167;6.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise with the default value of its kind</span><span class="named-paragraph-number">6.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise with the default value of its kind</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -439,8 +530,8 @@ which makes its kind safe. Hence the error messages.
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-vrb.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_2" class="paragraph-anchor"></a><b>&#167;6.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue a problem for one variable set equal to another</span><span class="named-paragraph-number">6.2</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="4-vrb.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>&#167;7.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue a problem for one variable set equal to another</span><span class="named-paragraph-number">7.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -474,7 +565,7 @@ which makes its kind safe. Hence the error messages.
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-vrb.html#SP6">&#167;6</a>.</li></ul>
<ul class="endnotetexts"><li>This code is used in <a href="4-vrb.html#SP7">&#167;7</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-tv.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-ad.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-fc.html">fc</a></li><li class="progresssection"><a href="4-i6i.html">i6i</a></li><li class="progresssection"><a href="4-lt.html">lt</a></li><li class="progresssection"><a href="4-jl.html">jl</a></li><li class="progresssection"><a href="4-tl.html">tl</a></li><li class="progresssection"><a href="4-ts.html">ts</a></li><li class="progresssection"><a href="4-rsp.html">rsp</a></li><li class="progresssection"><a href="4-ct.html">ct</a></li><li class="progresssection"><a href="4-cl.html">cl</a></li><li class="progresssection"><a href="4-rtn.html">rtn</a></li><li class="progresssection"><a href="4-rls.html">rls</a></li><li class="progresssection"><a href="4-act.html">act</a></li><li class="progresssection"><a href="4-es.html">es</a></li><li class="progresssection"><a href="4-iti.html">iti</a></li><li class="progresssection"><a href="4-ts2.html">ts2</a></li><li class="progresssection"><a href="4-itc.html">itc</a></li><li class="progresssection"><a href="4-uoart.html">uoart</a></li><li class="progresssection"><a href="4-tv.html">tv</a></li><li class="progresscurrent">vrb</li><li class="progresssection"><a href="4-prp.html">prp</a></li><li class="progresssection"><a href="4-msr.html">msr</a></li><li class="progresssection"><a href="4-epv.html">epv</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progresssection"><a href="4-ic.html">ic</a></li><li class="progresssection"><a href="4-adj.html">adj</a></li><li class="progresssection"><a href="4-rsfk.html">rsfk</a></li><li class="progresssection"><a href="4-efart.html">efart</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-vart.html">vart</a></li><li class="progresssection"><a href="4-rart.html">rart</a></li><li class="progresssection"><a href="4-lpart.html">lpart</a></li><li class="progresssection"><a href="4-rsft.html">rsft</a></li><li class="progresssection"><a href="4-icd.html">icd</a></li><li class="progresssection"><a href="4-pr.html">pr</a></li><li class="progresssection"><a href="4-cls.html">cls</a></li><li class="progresschapter"><a href="5-nmn.html">5</a></li><li class="progressnext"><a href="4-prp.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -164,9 +164,11 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">action_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">an</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">, </span><span class="identifier-syntax">action_name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">StackedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ACTION_STV_CREATOR_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">an_package</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StackedVariables::compile_frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">SharedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ACTION_STV_CREATOR_FN_HL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">an_package</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SharedVariables::set_frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP4" class="function-link"><span class="function-syntax">RTVariables::compile_frame_creator</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
@ -262,8 +264,8 @@ infrastructure, and we access it with a single call.
<span class="plain-syntax"> </span><a href="4-rsfk.html#SP15" class="function-link"><span class="function-syntax">RTKinds::emit_strong_id</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ActionSemantics::kind_of_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="4-rsfk.html#SP15" class="function-link"><span class="function-syntax">RTKinds::emit_strong_id</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ActionSemantics::kind_of_second</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">StackedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_iname_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">StackedVariables::frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">SharedVariables::set_empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_iname_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SharedVariables::frame_creator</span><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">action_variables</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (20000+</span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>

View file

@ -111,7 +111,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">store_instead</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">STORED_ACTION_TY_CURRENT_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::emit_allocation</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_stored_action</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::emit_new_local_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_stored_action</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
@ -778,7 +778,7 @@ and in this case we therefore ignore <span class="extract"><span class="extract-
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OPTIONAL_CLAUSE_CPMC:</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">StackedVariables::get_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">apoc</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">stv_to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SharedVariables::get_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">apoc</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">stv_to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-ap.html#SP4" class="function-link"><span class="function-syntax">RTActionPatterns::compile_pattern_match_clause</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="4-tv.html#SP3" class="function-link"><span class="function-syntax">RTTemporaryVariables::from_existing_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">apoc</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">stv_to_match</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">underlying_var</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">apoc</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">clause_spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">APClauses::opt</span><span class="plain-syntax">(</span><span class="identifier-syntax">apoc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ALLOW_REGION_AS_ROOM_APCOPT</span><span class="plain-syntax">));</span>

View file

@ -107,7 +107,7 @@ constants.
<span class="plain-syntax"> </span><span class="identifier-syntax">NonlocalVariables::initial_value_as_plain_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">story_title_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VariableSubjects::has_initial_value_set</span><span class="plain-syntax">(</span><span class="identifier-syntax">story_title_VAR</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">story_title_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">story_title_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><a href="4-tl.html#SP12" class="function-link"><span class="function-syntax">TextLiterals::compile_literal_from_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"\"Welcome\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::named_generic_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
@ -125,7 +125,7 @@ constants.
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VariableSubjects::has_initial_value_set</span><span class="plain-syntax">(</span><span class="identifier-syntax">story_headline_VAR</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NonlocalVariables::initial_value_as_plain_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">story_headline_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">story_headline_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">story_headline_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="4-tl.html#SP12" class="function-link"><span class="function-syntax">TextLiterals::compile_literal_from_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"\"An Interactive Fiction\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
@ -144,7 +144,7 @@ constants.
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">STORY_AUTHOR_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NonlocalVariables::initial_value_as_plain_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">story_author_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">story_author_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">story_author_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::named_generic_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">global_compilation_settings</span><span class="plain-syntax">.</span><span class="identifier-syntax">story_author_given</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
@ -166,7 +166,7 @@ constants.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VariableSubjects::has_initial_value_set</span><span class="plain-syntax">(</span><span class="identifier-syntax">story_release_number_VAR</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RELEASE_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">story_release_number_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">story_release_number_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::named_generic_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>

View file

@ -121,7 +121,7 @@ function togglePopup(material_id) {
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="4-rtn.html#SP2" class="function-link"><span class="function-syntax">Routines::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">los</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">los_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">it_lv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalVariables::add_pronoun</span><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">it_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalVariables::declare_this</span><span class="plain-syntax">(</span><span class="identifier-syntax">it_lv</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">8</span><span class="plain-syntax">);</span>

View file

@ -76,12 +76,12 @@ the player for <span class="extract"><span class="extract-syntax">WorldModelKit<
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INITIALSITUATION_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::named_array_begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::emit_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">player_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::emit_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">player_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">start_object</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_iname_entry</span></a><span class="plain-syntax">(</span><a href="4-ins.html#SP1" class="function-link"><span class="function-syntax">RTInstances::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">start_object</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">start_room</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_iname_entry</span></a><span class="plain-syntax">(</span><a href="4-ins.html#SP1" class="function-link"><span class="function-syntax">RTInstances::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">start_room</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::emit_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">time_of_day_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::emit_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">time_of_day_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::array_end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
@ -110,7 +110,7 @@ the function <span class="extract"><span class="extract-syntax">ChangePlayer</sp
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTPlayer::player_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP5" class="function-link"><span class="function-syntax">RTVariables::set_write_schema</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ChangePlayer(*2)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::set_write_schema</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ChangePlayer(*2)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">

View file

@ -80,7 +80,7 @@
<span class="plain-syntax"> </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VariableSubjects::has_initial_value_set</span><span class="plain-syntax">(</span><span class="identifier-syntax">max_score_VAR</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP6" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">max_score_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-vrb.html#SP7" class="function-link"><span class="function-syntax">RTVariables::seek_initial_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">max_score_VAR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::named_generic_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::named_numeric_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>

View file

@ -455,7 +455,7 @@ membership, which is to say, not really a difference at all.
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Variables. </b>Internally there
are three sources of these: locals, defined by "let" or "repeat" phrases;
stacked variables, which belong to rulebooks, actions or activities; and
shared variables, which belong to rulebooks, actions or activities; and
global variables. The narrower in scope take priority over the broader: so
if there are both local and global variables called "grand total", then
the text "grand total" is parsed as the local.
@ -496,13 +496,13 @@ the text "grand total" is parsed as the local.
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;s-stacked-variable&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">ph_stack_frame</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">phsf</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">Frames::current_stack_frame</span><span class="Preform-plain-syntax">();</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">stack_frame</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">phsf</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">Frames::current_stack_frame</span><span class="Preform-plain-syntax">();</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">phsf</span><span class="Preform-plain-syntax"> == </span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">) { ==&gt; { </span><span class="Preform-identifier-syntax">fail</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">nonterminal</span><span class="Preform-plain-syntax"> }; }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">stacked_variable</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">stv</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">StackedVariables::parse_from_access_list</span><span class="Preform-plain-syntax">(</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">Frames::get_stvol</span><span class="Preform-plain-syntax">(), </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">shared_variable</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">stv</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">SharedVariables::parse_from_access_list</span><span class="Preform-plain-syntax">(</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">Frames::get_shared_variable_access_list</span><span class="Preform-plain-syntax">(), </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">stv</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">parse_node</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">spec</span><span class="Preform-plain-syntax"> = </span><a href="2-lvl.html#SP2" class="function-link"><span class="Preform-function-syntax">Lvalues::new_actual_NONLOCAL_VARIABLE</span></a><span class="Preform-plain-syntax">(</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">StackedVariables::get_variable</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">stv</span><span class="Preform-plain-syntax">));</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">SharedVariables::get_variable</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">stv</span><span class="Preform-plain-syntax">));</span>
<span class="Preform-plain-syntax"> ==&gt; { -, </span><span class="Preform-identifier-syntax">spec</span><span class="Preform-plain-syntax"> }; </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">TRUE</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> }</span>
<span class="Preform-plain-syntax"> ==&gt; { </span><span class="Preform-identifier-syntax">fail</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">nonterminal</span><span class="Preform-plain-syntax"> };</span>

View file

@ -1,12 +1,12 @@
Total memory consumption was 266400K = 260 MB
Total memory consumption was 269600K = 263 MB
63.6% was used for 1349327 objects, in 294037 frames in 212 x 800K = 169600K = 165 MB:
64.0% was used for 1354657 objects, in 299367 frames in 216 x 800K = 172800K = 168 MB:
9.5% inter_tree_node_array 36 x 8192 = 294912 objects, 25953408 bytes
5.3% text_stream_array 2583 x 100 = 258300 objects, 14547456 bytes
4.1% linked_list 20385 objects, 11415600 bytes
9.4% inter_tree_node_array 36 x 8192 = 294912 objects, 25953408 bytes
5.2% text_stream_array 2583 x 100 = 258300 objects, 14547456 bytes
5.2% linked_list 25715 objects, 14400400 bytes
3.7% parse_node 129371 objects, 10349680 bytes
2.7% verb_conjugation 160 objects, 7425280 bytes
2.6% verb_conjugation 160 objects, 7425280 bytes
2.5% parse_node_annotation_array 431 x 500 = 215500 objects, 6909792 bytes
2.2% inter_symbol_array 69 x 1024 = 70656 objects, 6219936 bytes
1.1% pcalc_prop_array 24 x 1000 = 24000 objects, 3264768 bytes
@ -65,7 +65,7 @@ Total memory consumption was 266400K = 260 MB
---- actions_rcd_data 1880 objects, 60160 bytes
---- command_grammar 130 objects, 58240 bytes
---- pcalc_func_array 1 x 1000 objects, 56032 bytes
---- ph_stack_frame_box 577 objects, 55392 bytes
---- stack_frame_box 577 objects, 55392 bytes
---- kind_constructor 77 objects, 54824 bytes
---- cg_token 603 objects, 53064 bytes
---- property_inference_data 1315 objects, 52600 bytes
@ -82,9 +82,9 @@ Total memory consumption was 266400K = 260 MB
---- regions_data 670 objects, 32160 bytes
---- HTML_tag_array 1 x 1000 objects, 32032 bytes
---- property_permission 96 objects, 30720 bytes
---- stacked_variable_access_list_array 9 x 100 = 900 objects, 29088 bytes
---- shared_variable_access_list_array 9 x 100 = 900 objects, 29088 bytes
---- verb_sense 403 objects, 29016 bytes
---- stacked_variable_set_array 6 x 100 = 600 objects, 28992 bytes
---- shared_variable_set_array 6 x 100 = 600 objects, 28992 bytes
---- heading 198 objects, 28512 bytes
---- action_pattern_array 7 x 100 = 700 objects, 28224 bytes
---- counting_data 670 objects, 26800 bytes
@ -113,7 +113,7 @@ Total memory consumption was 266400K = 260 MB
---- equation_node 68 objects, 7616 bytes
---- understanding_item_array 3 x 100 = 300 objects, 7296 bytes
---- determiner 22 objects, 7216 bytes
---- stacked_variable_array 1 x 100 objects, 6432 bytes
---- shared_variable_array 1 x 100 objects, 6432 bytes
---- uniqueness_count 260 objects, 6240 bytes
---- verb 108 objects, 6048 bytes
---- text_literal_holder 145 objects, 5800 bytes
@ -166,94 +166,94 @@ Total memory consumption was 266400K = 260 MB
---- quantifier 16 objects, 1024 bytes
---- table_column 16 objects, 896 bytes
---- inbuild_requirement 22 objects, 880 bytes
---- control_structure_phrase 12 objects, 864 bytes
---- code_generation 1 object, 864 bytes
---- control_structure_phrase 12 objects, 864 bytes
---- cached_understanding 21 objects, 840 bytes
---- runtime_kind_structure 13 objects, 832 bytes
---- phrase_option_array 1 x 100 objects, 824 bytes
---- target_vm 6 objects, 816 bytes
---- pipeline_stage 17 objects, 816 bytes
---- target_vm 6 objects, 816 bytes
---- generated_segment 25 objects, 800 bytes
---- inter_data_type 14 objects, 784 bytes
---- submodule_identity 23 objects, 736 bytes
---- inform_language 6 objects, 672 bytes
---- relation_guard 5 objects, 640 bytes
---- I6T_intervention 8 objects, 640 bytes
---- inter_warehouse_room 10 objects, 640 bytes
---- relation_guard 5 objects, 640 bytes
---- nascent_array 7 objects, 616 bytes
---- inbuild_search_result 15 objects, 600 bytes
---- named_rulebook_outcome 15 objects, 600 bytes
---- inbuild_search_result 15 objects, 600 bytes
---- label_namespace 10 objects, 560 bytes
---- rulebook_outcome 17 objects, 544 bytes
---- small_word_set 11 objects, 528 bytes
---- inform_kit 5 objects, 520 bytes
---- implication 13 objects, 520 bytes
---- inform_kit 5 objects, 520 bytes
---- inference_family 11 objects, 440 bytes
---- i6_memory_setting 13 objects, 416 bytes
---- equation 4 objects, 416 bytes
---- module_package 10 objects, 400 bytes
---- dval_written 10 objects, 400 bytes
---- bp_family 12 objects, 384 bytes
---- module_package 10 objects, 400 bytes
---- article_usage 8 objects, 384 bytes
---- bp_family 12 objects, 384 bytes
---- source_file 5 objects, 360 bytes
---- inbuild_genre 7 objects, 336 bytes
---- door_dir_notice 5 objects, 320 bytes
---- pronoun 8 objects, 320 bytes
---- door_dir_notice 5 objects, 320 bytes
---- grammatical_category 8 objects, 320 bytes
---- up_family 9 objects, 288 bytes
---- build_step 4 objects, 288 bytes
---- explicit_bp_data 5 objects, 280 bytes
---- door_to_notice 5 objects, 280 bytes
---- explicit_bp_data 5 objects, 280 bytes
---- inform_pipeline 4 objects, 256 bytes
---- verb_usage_tier 5 objects, 240 bytes
---- adjective_meaning_family 7 objects, 224 bytes
---- release_instructions 1 object, 208 bytes
---- test_scenario 1 object, 208 bytes
---- compilation_unit 5 objects, 200 bytes
---- release_instructions 1 object, 208 bytes
---- build_skill 5 objects, 200 bytes
---- compilation_unit 5 objects, 200 bytes
---- kit_dependency 4 objects, 192 bytes
---- plural_dictionary_entry 4 objects, 192 bytes
---- inform_project 1 object, 176 bytes
---- link_instruction 4 objects, 160 bytes
---- imperative_defn_family 4 objects, 160 bytes
---- inference_subject_family 5 objects, 160 bytes
---- pointer_allocation 2 objects, 160 bytes
---- inter_architecture 4 objects, 160 bytes
---- code_generation_target 4 objects, 160 bytes
---- element_activation 4 objects, 128 bytes
---- link_instruction 4 objects, 160 bytes
---- codegen_pipeline 1 object, 128 bytes
---- element_activation 4 objects, 128 bytes
---- inbuild_nest 3 objects, 120 bytes
---- local_block_value 2 objects, 112 bytes
---- inform_kit_ittt 2 objects, 96 bytes
---- list_together_routine 2 objects, 80 bytes
---- article 2 objects, 80 bytes
---- list_together_routine 2 objects, 80 bytes
---- compile_task_data 1 object, 80 bytes
---- build_methodology 1 object, 56 bytes
---- inter_warehouse 1 object, 56 bytes
---- build_methodology 1 object, 56 bytes
---- HTML_file_state 1 object, 48 bytes
---- figures_data 1 object, 48 bytes
---- star_invention 1 object, 48 bytes
---- by_routine_bp_data 1 object, 40 bytes
---- parse_name_notice 1 object, 40 bytes
---- figures_data 1 object, 48 bytes
---- loop_over_scope 1 object, 40 bytes
---- by_routine_bp_data 1 object, 40 bytes
---- kind_template_definition 1 object, 40 bytes
---- parse_name_notice 1 object, 40 bytes
36.3% was used for memory not allocated for objects:
35.9% was used for memory not allocated for objects:
15.4% text stream storage 42068616 bytes in 264534 claims
3.4% dictionary storage 9278976 bytes in 16372 claims
15.2% text stream storage 42067784 bytes in 264528 claims
3.3% dictionary storage 9278976 bytes in 16372 claims
---- sorting 992 bytes in 3 claims
2.6% source text 7200000 bytes in 3 claims
3.9% source text details 10800000 bytes in 2 claims
---- linguistic stock array 81920 bytes in 2 claims
---- small word set array 105600 bytes in 22 claims
0.8% inter symbols storage 2280320 bytes in 13937 claims
6.1% inter bytecode storage 16802820 bytes in 14 claims
3.2% inter links storage 8750208 bytes in 246 claims
6.0% inter bytecode storage 16802820 bytes in 14 claims
3.1% inter links storage 8750208 bytes in 246 claims
0.6% instance-of-kind counting 1695204 bytes in 1 claim
---- compilation workspace for objects 21856 bytes in 25 claims
---- lists for type-checking invocations 16000 bytes in 1 claim
---- emitter array storage 12320 bytes in 8 claims
---- code generation workspace for objects 9200 bytes in 9 claims
20.6% was overhead - 56335712 bytes = 55015K = 53 MB
20.5% was overhead - 56627760 bytes = 55300K = 54 MB

View file

@ -1,15 +1,16 @@
100.0% in inform7 run
66.7% in compilation to Inter
25.7% in //ImperativeDefinitions::compile_first_block//
8.0% in //PhraseRequests::compile_as_needed//
6.8% in //Strings::compile_responses//
6.2% in //InferenceSubjects::emit_all//
4.2% in //MajorNodes::pre_pass//
3.3% in //MajorNodes::pass_1//
66.9% in compilation to Inter
25.3% in //ImperativeDefinitions::compile_first_block//
8.1% in //PhraseRequests::compile_as_needed//
6.9% in //Strings::compile_responses//
6.0% in //InferenceSubjects::emit_all//
4.3% in //MajorNodes::pre_pass//
3.4% in //MajorNodes::pass_1//
2.0% in //RTRules::RulePrintingRule_routine//
1.8% in //ImperativeDefinitions::assess_all//
1.8% in //RTRules::rulebooks_array_array//
1.1% in //RTVerbs::ConjugateVerb//
1.7% in //ImperativeDefinitions::assess_all//
0.9% in //RTVerbs::ConjugateVerb//
0.3% in //CommandGrammars::prepare//
0.3% in //MajorNodes::pass_2//
0.3% in //RTRelations::compile_defined_relations//
0.3% in //RTRules::compile_rulebooks//
@ -17,11 +18,10 @@
0.1% in //RTCommandGrammars::compile_all//
0.1% in //RTKinds::compile_data_type_support_routines//
0.1% in //Task::make_built_in_kind_constructors//
0.1% in //World::stages_II_and_III//
3.3% not specifically accounted for
30.8% in running Inter pipeline
9.9% in inter step 2/12: link
9.9% in step preparation
3.6% not specifically accounted for
30.6% in running Inter pipeline
10.0% in step preparation
9.8% in inter step 2/12: link
7.1% in inter step 12/12: generate inform6 -> auto.inf
0.3% in inter step 9/12: make-identifiers-unique
0.1% in inter step 10/12: reconcile-verbs
@ -30,6 +30,6 @@
0.1% in inter step 6/12: assimilate
0.1% in inter step 7/12: resolve-external-symbols
0.1% in inter step 8/12: inspect-plugs
2.4% not specifically accounted for
2.1% not specifically accounted for
2.0% in supervisor
0.4% not specifically accounted for

View file

@ -81,7 +81,7 @@ void AdjectivalDefinitionFamily::given_body(imperative_defn_family *self, impera
wording CALLW = EMPTY_WORDING;
kind *K = NULL;
Phrases::Phrasal::define_adjective_by_phrase(id->at, body, &CALLW, &K);
LocalVariables::add_pronoun(&(body->compilation_data.stack_frame), CALLW, K);
LocalVariables::add_pronoun(&(body->compilation_data.id_stack_frame), CALLW, K);
}

View file

@ -110,7 +110,7 @@ VOID_METHOD_TYPE(TO_RCD_IMP_DEFN_MTID, imperative_defn_family *f, imperative_def
id_runtime_context_data ImperativeDefinitionFamilies::to_phrcd(imperative_defn *id) {
current_sentence = id->at;
Frames::make_current(&(id->body_of_defn->compilation_data.stack_frame));
Frames::make_current(&(id->body_of_defn->compilation_data.id_stack_frame));
id_runtime_context_data phrcd = RuntimeContextData::new();
VOID_METHOD_CALL(id->family, TO_RCD_IMP_DEFN_MTID, id, &phrcd);
Frames::remove_current();

View file

@ -181,10 +181,10 @@ void RuntimeContextData::ensure_avl(rule *R) {
parse_node *save_cs = current_sentence;
current_sentence = id->at;
ph_stack_frame *phsf = &(idb->compilation_data.stack_frame);
stack_frame *phsf = &(idb->compilation_data.id_stack_frame);
Frames::make_current(phsf);
Frames::set_stvol(phsf, R->variables_visible_in_definition);
Frames::set_shared_variable_access_list(phsf, R->variables_visible_in_definition);
rcd->avl = RuntimeContextData::parse_avl(rcd->activity_context);
current_sentence = save_cs;
}

View file

@ -13,7 +13,7 @@ typedef struct activity {
struct rulebook *for_rules;
struct rulebook *after_rules;
struct kind *activity_on_what_kind; /* or null */
struct stacked_variable_set *activity_variables; /* activity variables owned here */
struct shared_variable_set *activity_variables; /* activity variables owned here */
struct activity_indexing_data indexing_data;
struct activity_compilation_data compilation_data;
CLASS_DEFINITION
@ -84,7 +84,7 @@ activity *Activities::new(kind *K, wording W) {
@<Make proper nouns for the activity name@>;
av->activity_variables = StackedVariables::new_set(10000+av->allocation_id);
av->activity_variables = SharedVariables::new_set(10000+av->allocation_id);
av->before_rules = Activities::make_rulebook(av, 0, future_action_flag);
av->for_rules = Activities::make_rulebook(av, 1, future_action_flag);
@ -210,7 +210,7 @@ void Activities::add_variable(activity *av, parse_node *cnode) {
@<The specification must be just a kind@>;
@<That kind must be definite@>;
StackedVariables::add_empty(av->activity_variables, VW, Specifications::to_kind(spec));
SharedVariables::new(av->activity_variables, VW, Specifications::to_kind(spec));
}
@<The name of the variable must be fortunate@> =

View file

@ -31,8 +31,8 @@ typedef struct rulebook {
int runs_during_activities; /* allow "while..." clauses to name these */
int used_by_future_action_activity; /* like "deciding the scope of something..." */
struct stacked_variable_set *my_variables; /* rulebook variables owned here */
struct stacked_variable_access_list *accessible_variables; /* and which can be named here */
struct shared_variable_set *my_variables; /* rulebook variables owned here */
struct shared_variable_access_list *accessible_variables; /* and which can be named here */
struct rulebook_compilation_data compilation_data;
struct rulebook_indexing_data indexing_data;
@ -62,9 +62,9 @@ rulebook *Rulebooks::new(kind *create_as, wording W, package_request *R) {
@<Work out the focus and outcome@>;
B->my_variables = StackedVariables::new_set(B->allocation_id);
B->accessible_variables = StackedVariables::new_access_list();
StackedVariables::add_set_to_access_list(B->accessible_variables, B->my_variables);
B->my_variables = SharedVariables::new_set(B->allocation_id);
B->accessible_variables = SharedVariables::new_access_list();
SharedVariables::add_set_to_access_list(B->accessible_variables, B->my_variables);
B->compilation_data = RTRules::new_rulebook_compilation_data(B, R);
B->indexing_data = IXRules::new_rulebook_indexing_data(B);
@ -352,7 +352,7 @@ void Rulebooks::add_variable(rulebook *B, parse_node *cnode) {
@<In fact, its description has to be a kind@>;
@<And a definite one at that@>;
StackedVariables::add_empty(B->my_variables, W, K);
SharedVariables::new(B->my_variables, W, K);
}
@<The variable has to have a name@> =
@ -449,8 +449,8 @@ defined somewhere else -- but they still don't belong to |B|, so they do not
go into |B->my_variables|.
=
void Rulebooks::grant_access_to_variables(rulebook *B, stacked_variable_set *set) {
StackedVariables::add_set_to_access_list(B->accessible_variables, set);
void Rulebooks::grant_access_to_variables(rulebook *B, shared_variable_set *set) {
SharedVariables::add_set_to_access_list(B->accessible_variables, set);
}
@h Attaching and detaching rules.

View file

@ -33,7 +33,7 @@ typedef struct rule {
struct rulebook *kind_of_rule_set_from;
struct imperative_defn *defn_as_I7_source; /* if defined by an I7 id_body */
struct stacked_variable_access_list *variables_visible_in_definition; /* if so */
struct shared_variable_access_list *variables_visible_in_definition; /* if so */
struct text_stream *defn_as_Inter_function; /* if not */
struct booking *automatic_booking; /* how this is placed in rulebooks */
@ -76,7 +76,7 @@ rule *Rules::obtain(wording W, int allow_responses) {
R->kind_of_rule_set_from = NULL;
R->defn_as_I7_source = NULL;
R->variables_visible_in_definition = StackedVariables::new_access_list();
R->variables_visible_in_definition = SharedVariables::new_access_list();
R->defn_as_Inter_function = NULL;
R->automatic_booking = NULL;
@ -231,13 +231,13 @@ imperative_defn *Rules::get_imperative_definition(rule *R) {
return R->defn_as_I7_source;
}
@ Inside such a definition, certain stacked variables may be in scope. For
@ Inside such a definition, certain shared variables may be in scope. For
example, if a rule is in an activity rulebook, then it will be able to see
the variables belonging to that activity.
=
void Rules::put_variables_in_scope(rule *R, stacked_variable_access_list *access) {
StackedVariables::append_access_list(R->variables_visible_in_definition, access);
void Rules::put_variables_in_scope(rule *R, shared_variable_access_list *access) {
SharedVariables::append_access_list(R->variables_visible_in_definition, access);
}
void Rules::put_action_variables_in_scope(rule *R) {
@ -248,13 +248,13 @@ void Rules::put_action_variables_in_scope(rule *R) {
#endif
}
struct stacked_variable_access_list *all_action_processing_vars = NULL;
struct shared_variable_access_list *all_action_processing_vars = NULL;
stacked_variable_access_list *Rules::all_action_processing_variables(void) {
shared_variable_access_list *Rules::all_action_processing_variables(void) {
if (all_action_processing_vars == NULL) {
all_action_processing_vars = StackedVariables::new_access_list();
all_action_processing_vars = SharedVariables::new_access_list();
rulebook *B = Rulebooks::std(ACTION_PROCESSING_RB);
if (B) StackedVariables::add_set_to_access_list(all_action_processing_vars, B->my_variables);
if (B) SharedVariables::add_set_to_access_list(all_action_processing_vars, B->my_variables);
}
return all_action_processing_vars;
}

View file

@ -340,13 +340,13 @@ whether it is able to do this or not.
=
INT_METHOD_TYPE(GENERATE_IN_SUPPORT_FUNCTION_ADJM_MTID, adjective_meaning_family *f,
adjective_meaning *am, int T, int emit_flag, ph_stack_frame *phsf)
adjective_meaning *am, int T, int emit_flag, stack_frame *phsf)
@ This dual behaviour means there are two function calls invoking it:
=
int AdjectiveMeanings::generate_in_support_function(adjective_meaning *am,
int T, ph_stack_frame *phsf) {
int T, stack_frame *phsf) {
int rv = AdjectiveMeanings::nscg_inner(am, T, TRUE, phsf);
am->has_been_compiled_in_support_function = TRUE;
return rv;
@ -357,7 +357,7 @@ int AdjectiveMeanings::can_generate_in_support_function(adjective_meaning *am, i
}
int AdjectiveMeanings::nscg_inner(adjective_meaning *am, int T, int emit_flag,
ph_stack_frame *phsf) {
stack_frame *phsf) {
AdjectiveMeanings::prepare_schemas(am, T);
@<Use the I6 schema instead to compile the task, if one exists@>;
int rv = FALSE;

View file

@ -134,9 +134,9 @@ DECLARE_CLASS(text_substitution)
@e property_setting_bp_data_CLASS
@e relation_inference_data_CLASS
@e short_name_notice_CLASS
@e stacked_variable_CLASS
@e stacked_variable_set_CLASS
@e stacked_variable_access_list_CLASS
@e shared_variable_CLASS
@e shared_variable_set_CLASS
@e shared_variable_access_list_CLASS
@e value_property_data_CLASS
=
@ -155,9 +155,9 @@ DECLARE_CLASS(property_inference_data)
DECLARE_CLASS(property_setting_bp_data)
DECLARE_CLASS(relation_inference_data)
DECLARE_CLASS(short_name_notice)
DECLARE_CLASS_ALLOCATED_IN_ARRAYS(stacked_variable, 100)
DECLARE_CLASS_ALLOCATED_IN_ARRAYS(stacked_variable_set, 100)
DECLARE_CLASS_ALLOCATED_IN_ARRAYS(stacked_variable_access_list, 100)
DECLARE_CLASS_ALLOCATED_IN_ARRAYS(shared_variable, 100)
DECLARE_CLASS_ALLOCATED_IN_ARRAYS(shared_variable_set, 100)
DECLARE_CLASS_ALLOCATED_IN_ARRAYS(shared_variable_access_list, 100)
DECLARE_CLASS(value_property_data)
@ //imperative// --
@ -167,8 +167,8 @@ DECLARE_CLASS(value_property_data)
@e past_tense_action_record_CLASS
@e past_tense_condition_record_CLASS
@e pcalc_prop_deferral_CLASS
@e ph_stack_frame_box_CLASS
@e pointer_allocation_CLASS
@e stack_frame_box_CLASS
@e local_block_value_CLASS
=
DECLARE_CLASS_ALLOCATED_IN_ARRAYS(invocation_options, 100)
@ -176,8 +176,8 @@ DECLARE_CLASS_ALLOCATED_IN_ARRAYS(local_variable, 100)
DECLARE_CLASS(past_tense_action_record)
DECLARE_CLASS(past_tense_condition_record)
DECLARE_CLASS(pcalc_prop_deferral)
DECLARE_CLASS(ph_stack_frame_box)
DECLARE_CLASS(pointer_allocation)
DECLARE_CLASS(stack_frame_box)
DECLARE_CLASS(local_block_value)
@ //runtime// --

View file

@ -519,7 +519,7 @@ the going action variables.
@e DIVERT_AP_CLAUSE_PLUG
=
int PluginCalls::divert_AP_clause_ID(stacked_variable *stv, int *id) {
int PluginCalls::divert_AP_clause_ID(shared_variable *stv, int *id) {
*id = -1;
PLUGINS_CALL(DIVERT_AP_CLAUSE_PLUG, stv, id);
}

View file

@ -343,7 +343,7 @@ typedef struct anl_clause {
int clause_ID;
struct wording clause_text;
struct anl_clause *next_clause;
struct stacked_variable *stv_to_match;
struct shared_variable *stv_to_match;
struct parse_node *evaluation;
} anl_clause;
@ -410,7 +410,7 @@ anl_entry *ActionNameLists::set_clause_wording(anl_entry *entry, int C, wording
=
anl_entry *ActionNameLists::set_clause_wording_and_stv(anl_entry *entry, int C,
wording W, stacked_variable *stv) {
wording W, shared_variable *stv) {
if (entry == NULL) internal_error("no entry");
anl_clause *prev = NULL;
LOOP_THROUGH_ANL_CLAUSES(c, entry) {
@ -1004,10 +1004,10 @@ are divergence points:
if (Word::unexpectedly_upper_case(Wordings::first_wn(W)) == FALSE) {
action_name *chief_an = currently_exploding_entry->item.action_listed;
if (chief_an) {
stacked_variable_set *stvo = chief_an->action_variables;
shared_variable_set *stvo = chief_an->action_variables;
if (stvo) {
stacked_variable *stv;
LOOP_OVER_LINKED_LIST(stv, stacked_variable, stvo->list_of_stvs) {
shared_variable *stv;
LOOP_OVER_LINKED_LIST(stv, shared_variable, stvo->variables) {
wording VW = stv->match_wording_text;
if (Wordings::starts_with(W, VW)) {
wording T = Wordings::from(W, Wordings::first_wn(W) + Wordings::length(VW));
@ -1040,7 +1040,7 @@ words appear somewhere in the text. As Inform ships with only seven different
clauses anyway, this will never be too bad.
=
void ActionNameLists::detonate(int potential_C, stacked_variable *stv, wording T, wording W) {
void ActionNameLists::detonate(int potential_C, shared_variable *stv, wording T, wording W) {
if (ActionNameLists::has_clause(currently_exploding_entry, potential_C) == FALSE) {
anl_entry *extra = ActionNameLists::duplicate_entry(currently_exploding_entry);

View file

@ -26,15 +26,15 @@ action variable clauses.
@e TAIL_AP_CLAUSE
=
int APClauses::clause_ID_for_action_variable(stacked_variable *stv) {
int APClauses::clause_ID_for_action_variable(shared_variable *stv) {
int D = -1;
PluginCalls::divert_AP_clause_ID(stv, &D); if (D >= 0) return D;
int oid = StackedVariables::get_owner_id(stv);
int off = StackedVariables::get_offset(stv);
int oid = SharedVariables::get_owner_id(stv);
int off = SharedVariables::get_offset(stv);
return 1000*oid + off;
}
void APClauses::write_clause_ID(OUTPUT_STREAM, int C, stacked_variable *stv) {
void APClauses::write_clause_ID(OUTPUT_STREAM, int C, shared_variable *stv) {
switch (C) {
case PARAMETRIC_AP_CLAUSE: WRITE("parameter"); break;
case ACTOR_AP_CLAUSE: WRITE("actor"); break;
@ -48,7 +48,7 @@ void APClauses::write_clause_ID(OUTPUT_STREAM, int C, stacked_variable *stv) {
PluginCalls::write_AP_clause_ID(OUT, C);
if (stv) {
WRITE("{");
NonlocalVariables::write(OUT, StackedVariables::get_variable(stv));
NonlocalVariables::write(OUT, SharedVariables::get_variable(stv));
WRITE("}");
}
}
@ -59,7 +59,7 @@ A single clause is an instance of:
=
typedef struct ap_clause {
int clause_ID;
struct stacked_variable *stv_to_match; /* can be |NULL| for some built-in clause IDs */
struct shared_variable *stv_to_match; /* can be |NULL| for some built-in clause IDs */
struct parse_node *clause_spec; /* what the pattern says about this value */
int clause_options; /* a bitmap of flags: see below */
struct ap_clause *next; /* in the linked list of clauses for an action pattern */
@ -246,9 +246,9 @@ The following functions deal only with clauses which are attached to action
variables:
=
void APClauses::set_action_variable_spec(action_pattern *ap, stacked_variable *stv,
void APClauses::set_action_variable_spec(action_pattern *ap, shared_variable *stv,
parse_node *spec) {
if (stv == NULL) internal_error("no stacked variable for apoc");
if (stv == NULL) internal_error("no shared variable for apoc");
int C = APClauses::clause_ID_for_action_variable(stv);
ap_clause *apoc = APClauses::ensure_clause(ap, C);
apoc->stv_to_match = stv;
@ -286,8 +286,8 @@ int APClauses::compare_specificity_of_av_clauses(action_pattern *ap1, action_pat
ap_clause *apoc1 = APClauses::advance_to_next_av_clause(ap1->ap_clauses),
*apoc2 = APClauses::advance_to_next_av_clause(ap2->ap_clauses);
while ((apoc1) && (apoc2)) {
int off1 = StackedVariables::get_offset(apoc1->stv_to_match);
int off2 = StackedVariables::get_offset(apoc2->stv_to_match);
int off1 = SharedVariables::get_offset(apoc1->stv_to_match);
int off2 = SharedVariables::get_offset(apoc2->stv_to_match);
if (off1 == off2) {
int rv = Specifications::compare_specificity(
apoc1->clause_spec, apoc2->clause_spec, NULL);

View file

@ -101,7 +101,7 @@ action_pattern *ActionPatterns::parse_action_based(wording W) {
action_pattern *ap = NULL;
int saved = ParseActionPatterns::enter_mode(PERMIT_TRYING_OMISSION);
if (Rules::all_action_processing_variables())
Frames::set_stvol(
Frames::set_shared_variable_access_list(
Frames::current_stack_frame(), Rules::all_action_processing_variables());
if (<action-pattern>(W)) ap = <<rp>>;
Frames::remove_nonphrase_stack_frame();

View file

@ -165,20 +165,20 @@ but action variables cannot.
variables (hence "nonempty") -- many will not, in practice:
= (early code)
stacked_variable_access_list *all_nonempty_stacked_action_vars = NULL;
shared_variable_access_list *all_nonempty_stacked_action_vars = NULL;
@ =
void ActionVariables::new(action_name *an, kind *K, wording NW, wording MW) {
if (all_nonempty_stacked_action_vars == NULL)
all_nonempty_stacked_action_vars = StackedVariables::new_access_list();
if (StackedVariables::set_empty(an->action_variables))
StackedVariables::add_set_to_access_list(
all_nonempty_stacked_action_vars = SharedVariables::new_access_list();
if (SharedVariables::set_empty(an->action_variables))
SharedVariables::add_set_to_access_list(
all_nonempty_stacked_action_vars, an->action_variables);
stacked_variable *stv = StackedVariables::add_empty(an->action_variables, NW, K);
shared_variable *stv = SharedVariables::new(an->action_variables, NW, K);
if (Wordings::nonempty(MW))
StackedVariables::set_matching_text(stv, MW);
SharedVariables::set_matching_text(stv, MW);
LOGIF(ACTION_CREATIONS, "Created action variable for $l: %W (%u)\n", an, NW, K);
if (Wordings::nonempty(MW))
@ -193,6 +193,6 @@ action patterns. For example, the Standard Rules define:
and this allows "exiting from the cage", say, as an action pattern.
=
stacked_variable *ActionVariables::parse_match_clause(action_name *an, wording W) {
return StackedVariables::parse_match_clause(an->action_variables, W);
shared_variable *ActionVariables::parse_match_clause(action_name *an, wording W) {
return SharedVariables::parse_match_clause(an->action_variables, W);
}

View file

@ -19,7 +19,7 @@ typedef struct action_name {
struct rulebook *check_rules; /* rulebooks private to this action */
struct rulebook *carry_out_rules;
struct rulebook *report_rules;
struct stacked_variable_set *action_variables;
struct shared_variable_set *action_variables;
struct cg_line *command_parser_grammar_producing_this; /* if any */
@ -55,7 +55,7 @@ action_name *Actions::act_new(wording W) {
an->carry_out_rules = Actions::new_rulebook(an, CARRY_OUT_RB_HL);
an->report_rules = Actions::new_rulebook(an, REPORT_RB_HL);
an->action_variables =
StackedVariables::new_set(RTActions::action_variable_set_ID(an));
SharedVariables::new_set(RTActions::action_variable_set_ID(an));
LOGIF(ACTION_CREATIONS, "Created action: %W\n", W);
return an;

View file

@ -93,9 +93,9 @@ If we do spot one of these five magic variables, we tie it to a clause with
a special ID number of our choice.
=
int GoingPlugin::divert_clause_ID(stacked_variable *stv, int *id) {
int oid = StackedVariables::get_owner_id(stv);
int off = StackedVariables::get_offset(stv);
int GoingPlugin::divert_clause_ID(shared_variable *stv, int *id) {
int oid = SharedVariables::get_owner_id(stv);
int off = SharedVariables::get_offset(stv);
if ((going_action) && (oid == GoingPlugin::id())) {
switch (off) {
case 0: *id = GOING_FROM_AP_CLAUSE; return TRUE;

View file

@ -432,10 +432,10 @@ to enable Inform to set up a stack frame if there isn't one already, and so on.
=
<ap-five-condition> internal {
ph_stack_frame *phsf = NULL;
stack_frame *phsf = NULL;
if (Frames::current_stack_frame() == NULL) phsf = Frames::new_nonphrasal();
StackedVariables::append_access_list(
Frames::get_stvol(), all_nonempty_stacked_action_vars);
SharedVariables::append_access_list(
Frames::get_shared_variable_access_list(), all_nonempty_stacked_action_vars);
LOGIF(ACTION_PATTERN_PARSING, "A when clause <%W> is suspected.\n", W);
parse_node *when_cond = NULL;
int s = pap_failure_reason;

View file

@ -189,7 +189,7 @@ to typecheck each clause.
return NULL;
}
} else {
check = StackedVariables::get_kind(c->stv_to_match);
check = SharedVariables::get_kind(c->stv_to_match);
}
}
if (Node::is(c->evaluation, UNKNOWN_NT)) fail = TRUE;

View file

@ -197,7 +197,7 @@ local_variable *LocalVariables::add_to_locals_slate(locals_slate *slate, int pur
they compile to the I6 names |t_0|, |t_1| and |t_2|.
=
local_variable *LocalVariables::add_call_parameter(ph_stack_frame *phsf,
local_variable *LocalVariables::add_call_parameter(stack_frame *phsf,
wording W, kind *K) {
local_variable *lvar = LocalVariables::add_to_locals_slate(&(phsf->local_value_variables),
TOKEN_CALL_PARAMETER_LV, W, K, NULL, -1);
@ -205,7 +205,7 @@ local_variable *LocalVariables::add_call_parameter(ph_stack_frame *phsf,
return lvar;
}
inter_symbol *LocalVariables::add_call_parameter_as_symbol(ph_stack_frame *phsf,
inter_symbol *LocalVariables::add_call_parameter_as_symbol(stack_frame *phsf,
wording W, kind *K) {
local_variable *v = LocalVariables::add_call_parameter(phsf, W, K);
return LocalVariables::declare_this(v, FALSE, 8);
@ -225,7 +225,7 @@ currently being compiled:
=
local_variable *LocalVariables::new(wording W, kind *K) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) internal_error("tried to add let value without stack frame");
local_variable *lvar = LocalVariables::add_to_locals_slate(&(phsf->local_value_variables),
LET_VALUE_LV, W, K, NULL, -1);
@ -248,7 +248,7 @@ local_variable *LocalVariables::add_internal(locals_slate *slate,
}
local_variable *LocalVariables::add_internal_local(text_stream *name) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf)
return LocalVariables::add_internal(&(phsf->local_value_variables), name,
INTERNAL_USE_LV);
@ -267,7 +267,7 @@ inter_symbol *LocalVariables::add_internal_local_as_symbol_noting(text_stream *n
}
local_variable *LocalVariables::add_named_call(text_stream *name) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf)
return LocalVariables::add_internal(&(phsf->local_value_variables), name,
OTHER_CALL_PARAMETER_LV);
@ -286,7 +286,7 @@ inter_symbol *LocalVariables::add_named_call_as_symbol_noting(text_stream *name,
}
local_variable *LocalVariables::add_internal_local_c(text_stream *name, char *comment) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf) {
local_variable *lvar =
LocalVariables::add_internal(&(phsf->local_value_variables),
@ -330,7 +330,7 @@ local_variable *LocalVariables::add_switch_value(kind *K) {
passed to its I6 routine, and this occupies a pseudo-call-parameter:
=
void LocalVariables::options_parameter_is_needed(ph_stack_frame *phsf) {
void LocalVariables::options_parameter_is_needed(stack_frame *phsf) {
LocalVariables::add_internal(&(phsf->local_value_variables),
I"phrase_options", OTHER_CALL_PARAMETER_LV);
}
@ -353,7 +353,7 @@ void LocalVariables::deallocate(local_variable *lvar) {
@ More extremely:
=
void LocalVariables::deallocate_all(ph_stack_frame *phsf) {
void LocalVariables::deallocate_all(stack_frame *phsf) {
local_variable *lvar;
LOOP_THROUGH_LOCALS_IN_FRAME(lvar, phsf)
if ((lvar->lv_purpose == LET_VALUE_LV) && (lvar->allocated))
@ -363,7 +363,7 @@ void LocalVariables::deallocate_all(ph_stack_frame *phsf) {
@h Extent.
=
int LocalVariables::count(ph_stack_frame *phsf) {
int LocalVariables::count(stack_frame *phsf) {
int ct = 0;
if (phsf) {
local_variable *lvar;
@ -383,7 +383,7 @@ list, because they may include variables which will be deallocated and then
given fresh names in between now and then.
=
void LocalVariables::copy(ph_stack_frame *phsf_to, ph_stack_frame *phsf_from) {
void LocalVariables::copy(stack_frame *phsf_to, stack_frame *phsf_from) {
locals_slate *slate_from = &(phsf_from->local_value_variables);
locals_slate *slate_to = &(phsf_to->local_value_variables);
@ -399,7 +399,7 @@ void LocalVariables::copy(ph_stack_frame *phsf_to, ph_stack_frame *phsf_from) {
slate_to->its_form_allowed = slate_from->its_form_allowed;
slate_to->it_pseudonym = slate_from->it_pseudonym;
phsf_to->local_stvol = phsf_from->local_stvol;
phsf_to->shared_variables = phsf_from->shared_variables;
}
@h Searching.
@ -427,26 +427,26 @@ local_variable *LocalVariables::find_any(locals_slate *slate, text_stream *name)
=
local_variable *LocalVariables::by_name(text_stream *name) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) return FALSE;
return LocalVariables::find_i6_var(&(phsf->local_value_variables), name, INTERNAL_USE_LV);
}
local_variable *LocalVariables::by_name_any(text_stream *name) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) return FALSE;
return LocalVariables::find_any(&(phsf->local_value_variables), name);
}
local_variable *LocalVariables::phrase_options(void) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) return NULL;
return LocalVariables::find_i6_var(&(phsf->local_value_variables), I"phrase_options", OTHER_CALL_PARAMETER_LV);
}
@ =
local_variable *LocalVariables::find_pcalc_var(int v) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) return NULL;
local_variable *lvar;
locals_slate *slate = &(phsf->local_value_variables);
@ -458,7 +458,7 @@ local_variable *LocalVariables::find_pcalc_var(int v) {
}
local_variable *LocalVariables::find_const_var(int v) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) return NULL;
TEMPORARY_TEXT(T)
WRITE_TO(T, "const_%d", v);
@ -475,7 +475,7 @@ local_variable *LocalVariables::find_const_var(int v) {
=
int LocalVariables::are_we_using_table_lookup(void) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) return FALSE;
if (LocalVariables::find_i6_var(&(phsf->local_value_variables), I"ct_0", INTERNAL_USE_LV)) return TRUE;
return FALSE;
@ -487,7 +487,7 @@ there isn't one.
=
local_variable *LocalVariables::get_ith_parameter(int i) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) internal_error("no stack frame exists");
local_variable *lvar;
int c = 0;
@ -510,14 +510,14 @@ function, to reuse as much earlier work as possible, and the following is
very fast.
=
local_variable *LocalVariables::parse(ph_stack_frame *phsf, wording W) {
local_variable *LocalVariables::parse(stack_frame *phsf, wording W) {
if (phsf == NULL) return NULL;
local_variable *lvar = LocalVariables::parse_inner(phsf, W);
if (lvar) lvar->parsed_recently = TRUE;
return lvar;
}
local_variable *LocalVariables::parse_inner(ph_stack_frame *phsf, wording W) {
local_variable *LocalVariables::parse_inner(stack_frame *phsf, wording W) {
if (phsf->local_value_variables.it_variable_exists)
if (<agent-pronoun>(W)) {
pronoun_usage *pu = <<rp>>;
@ -555,7 +555,7 @@ any need.
@ =
int stack_selection_used_recently = FALSE;
void LocalVariables::monitor_local_parsing(ph_stack_frame *phsf) {
void LocalVariables::monitor_local_parsing(stack_frame *phsf) {
if (phsf) {
local_variable *lvar;
LOOP_THROUGH_LOCALS_IN_FRAME(lvar, phsf)
@ -568,7 +568,7 @@ void LocalVariables::used_stack_selection(void) {
stack_selection_used_recently = TRUE;
}
int LocalVariables::local_parsed_recently(ph_stack_frame *phsf) {
int LocalVariables::local_parsed_recently(stack_frame *phsf) {
if (phsf) {
local_variable *lvar;
LOOP_THROUGH_LOCALS_IN_FRAME(lvar, phsf)
@ -587,7 +587,7 @@ fake up a call parameter pro tem.)
=
local_variable *LocalVariables::it_variable(void) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf) return LocalVariables::get_ith_parameter(0);
return LocalVariables::add_to_locals_slate(NULL, TOKEN_CALL_PARAMETER_LV,
EMPTY_WORDING, K_value, NULL, 0);
@ -597,29 +597,29 @@ local_variable *LocalVariables::it_variable(void) {
=
int LocalVariables::is_possessive_form_of_it_enabled(void) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf) return phsf->local_value_variables.its_form_allowed;
return FALSE;
}
void LocalVariables::enable_possessive_form_of_it(void) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) internal_error("no stack frame exists");
phsf->local_value_variables.its_form_allowed = TRUE;
}
local_variable *LocalVariables::add_pronoun(ph_stack_frame *phsf, wording W, kind *K) {
local_variable *LocalVariables::add_pronoun(stack_frame *phsf, wording W, kind *K) {
phsf->local_value_variables.it_variable_exists = TRUE;
return LocalVariables::add_call_parameter(phsf, W, K);
}
inter_symbol *LocalVariables::add_pronoun_as_symbol(ph_stack_frame *phsf, wording W, kind *K) {
inter_symbol *LocalVariables::add_pronoun_as_symbol(stack_frame *phsf, wording W, kind *K) {
phsf->local_value_variables.it_variable_exists = TRUE;
local_variable *v = LocalVariables::add_call_parameter(phsf, W, K);
return LocalVariables::declare_this(v, FALSE, 8);
}
void LocalVariables::alias_pronoun(ph_stack_frame *phsf, wording W) {
void LocalVariables::alias_pronoun(stack_frame *phsf, wording W) {
phsf->local_value_variables.it_pseudonym = W;
}
@ -630,14 +630,14 @@ our current locals to be still visible from inside it. What we do is to
park the values of the locals into a little scratch array before the call...
=
void LocalVariables::compile_storage(OUTPUT_STREAM, ph_stack_frame *phsf) {
void LocalVariables::compile_storage(OUTPUT_STREAM, stack_frame *phsf) {
local_variable *lvar;
int j=0;
LOOP_THROUGH_LOCALS_IN_FRAME(lvar, phsf)
WRITE("(LocalParking-->%d=%~L),", j++, lvar);
}
int LocalVariables::emit_storage(ph_stack_frame *phsf) {
int LocalVariables::emit_storage(stack_frame *phsf) {
int NC = 0;
inter_ti j = 0;
local_variable *lvar;
@ -663,7 +663,7 @@ int LocalVariables::emit_storage(ph_stack_frame *phsf) {
function, i.e., immediately after the call.
=
void LocalVariables::compile_retrieval(ph_stack_frame *phsf) {
void LocalVariables::compile_retrieval(stack_frame *phsf) {
inter_name *LP = Hierarchy::find(LOCALPARKING_HL);
inter_ti j=0;
local_variable *lvar;
@ -685,7 +685,7 @@ Another use for local variables is as the terms in an equation.
=
void LocalVariables::make_available_to_equation(equation *eqn) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf) {
local_variable *lvar;
LOOP_THROUGH_LOCALS_IN_FRAME(lvar, phsf)
@ -700,7 +700,7 @@ the text "X":
=
local_variable *LocalVariables::ensure_called_local(wording W, kind *K) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) return NULL; /* in case callings are made from parsing alone */
<new-called-name>(W);
local_variable *lvar = <<rp>>;
@ -786,7 +786,7 @@ name or a description.
} else return FALSE;
@<Make a new local for this calling@> =
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
==> { 0, (phsf)?(LocalVariables::new(W, K_object)):NULL };
@h Permissible names.
@ -937,7 +937,7 @@ void LocalVariables::mark_to_free_at_end_of_scope(local_variable *lvar) {
}
void LocalVariables::end_scope(int s) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) internal_error("relinquishing locals where no stack frame exists");
if (s <= 0) internal_error("the outermost scope cannot end");
@ -965,7 +965,7 @@ right result, so don't use it for anything else.
=
local_variable *LocalVariables::latest_repeat_variable(void) {
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (phsf) {
int s = Frames::Blocks::current_block_level();
local_variable *lvar;
@ -1075,7 +1075,7 @@ void LocalVariables::writer(OUTPUT_STREAM, char *format_string, void *vL) {
parameters:
=
void LocalVariables::compile_parameter_list(OUTPUT_STREAM, ph_stack_frame *phsf, int no_vars) {
void LocalVariables::compile_parameter_list(OUTPUT_STREAM, stack_frame *phsf, int no_vars) {
int purpose;
for (purpose = TOKEN_CALL_PARAMETER_LV; purpose <= OTHER_CALL_PARAMETER_LV; purpose++) {
local_variable *lvar;
@ -1087,7 +1087,7 @@ void LocalVariables::compile_parameter_list(OUTPUT_STREAM, ph_stack_frame *phsf,
}
}
void LocalVariables::emit_parameter_list(ph_stack_frame *phsf) {
void LocalVariables::emit_parameter_list(stack_frame *phsf) {
local_variable *lvar;
for (int purpose = TOKEN_CALL_PARAMETER_LV; purpose <= OTHER_CALL_PARAMETER_LV; purpose++)
LOOP_THROUGH_LOCALS_IN_FRAME(lvar, phsf)
@ -1098,7 +1098,7 @@ void LocalVariables::emit_parameter_list(ph_stack_frame *phsf) {
}
@ =
kind *LocalVariables::deduced_function_kind(ph_stack_frame *phsf) {
kind *LocalVariables::deduced_function_kind(stack_frame *phsf) {
int pc = 0;
local_variable *lvar;
LOOP_THROUGH_LOCALS_IN_FRAME(lvar, phsf)
@ -1120,7 +1120,7 @@ kind *LocalVariables::deduced_function_kind(ph_stack_frame *phsf) {
need in the compilation of any given routine:
=
void LocalVariables::declare(ph_stack_frame *phsf, int shell_mode) {
void LocalVariables::declare(stack_frame *phsf, int shell_mode) {
int purpose, from = TOKEN_CALL_PARAMETER_LV, to = INTERNAL_USE_LV;
if (shell_mode) to = OTHER_CALL_PARAMETER_LV;
if (phsf)

View file

@ -0,0 +1,214 @@
[SharedVariables::] Shared Variables.
Shared variables are held in common by all rules in a given rulebook.
@h Introduction.
Inform allows some variables to be shared by a number of different rules
(with different stack frames) and yet not be global in scope or permanent
in existence: they are shared by some process carried out by rulebooks.
The semantics of shared variables are unusual because rules can be
in multiple rulebooks, or can be moved out of their expected rulebooks.
Their names are therefore not limited in scope -- they are global, and
they belong to the same namespace as global variables. But access to them
is restricted to just those rules with permission.
Each //shared_variable// belongs to just one //shared_variable_set//, but the
code forming the body of a rule may be able to access multiple sets. So
each stack frame has its own //shared_variable_access_list// of those sets
which it can see.
@h Variables.
As can be seen, a shared variable is really just some additional expectations
placed on a global variable:
=
typedef struct shared_variable {
struct shared_variable_set *owner; /* who owns this */
struct wording name; /* text of the name */
struct parse_node *assigned_at; /* sentence assigning it */
struct nonlocal_variable *underlying_var; /* the variable in question */
int offset_in_owning_frame; /* word offset of storage (counts from 0) */
struct wording match_wording_text; /* matching text (relevant for action variables only) */
CLASS_DEFINITION
} shared_variable;
@ And it can only be created within a set:
=
shared_variable *SharedVariables::new(shared_variable_set *set, wording W, kind *K) {
shared_variable *shv = CREATE(shared_variable);
W = Articles::remove_the(W);
shv->name = W;
shv->owner = set;
shv->offset_in_owning_frame = LinkedLists::len(set->variables);
shv->assigned_at = current_sentence;
shv->match_wording_text = EMPTY_WORDING;
nonlocal_variable *nlv = NonlocalVariables::new(W, K, shv);
shv->underlying_var = nlv;
RTVariables::set_I6_identifier(nlv, FALSE, RTVariables::shv_rvalue(shv));
RTVariables::set_I6_identifier(nlv, TRUE, RTVariables::shv_lvalue(shv));
SharedVariables::add_to_set(shv, set);
return shv;
}
@ Some miscellaneous access functions:
=
int SharedVariables::get_owner_id(shared_variable *shv) {
return shv->owner->recognition_id;
}
int SharedVariables::get_offset(shared_variable *shv) {
return shv->offset_in_owning_frame;
}
kind *SharedVariables::get_kind(shared_variable *shv) {
nonlocal_variable *nlv = SharedVariables::get_variable(shv);
return NonlocalVariables::kind(nlv);
}
nonlocal_variable *SharedVariables::get_variable(shared_variable *shv) {
if (shv == NULL) return NULL;
return shv->underlying_var;
}
@ The match text associated with a shared variable is used in parsing action
patterns: see //if: Action Name Lists//. But for most shared variables, this
text remains empty.
=
void SharedVariables::set_matching_text(shared_variable *shv, wording W) {
shv->match_wording_text = W;
}
wording SharedVariables::get_matching_text(shared_variable *shv) {
return shv->match_wording_text;
}
@h Sets.
Sets are identified at run-time by an ID number, the "recognition ID", which
must be unique to that set and also small enough to be stored in what might
only be a 16-bit unsigned integer.
=
typedef struct shared_variable_set {
int recognition_id;
struct inter_name *creator_fn_iname;
struct linked_list *variables; /* of |shared_variable| */
CLASS_DEFINITION
} shared_variable_set;
shared_variable_set *SharedVariables::new_set(int id) {
shared_variable_set *set = CREATE(shared_variable_set);
set->recognition_id = id;
set->variables = NEW_LINKED_LIST(shared_variable);
set->creator_fn_iname = NULL;
return set;
}
int SharedVariables::set_empty(shared_variable_set *set) {
if (LinkedLists::len(set->variables) == 0) return TRUE;
return FALSE;
}
int size_of_largest_set = 0;
void SharedVariables::add_to_set(shared_variable *shv, shared_variable_set *set) {
ADD_TO_LINKED_LIST(shv, shared_variable, set->variables);
if (LinkedLists::len(set->variables) > size_of_largest_set)
size_of_largest_set = LinkedLists::len(set->variables);
}
int SharedVariables::size_of_largest_set(void) {
return size_of_largest_set;
}
@ The creator function claims memory to store these variables, and initialises
them, at runtime. Other parts of Inform creating sets are expected to set this
function name (and thus specify where in the Inter hierarchy it will go), and
also to call |RTVariables::compile_frame_creator|.
=
void SharedVariables::set_frame_creator(shared_variable_set *set, inter_name *iname) {
set->creator_fn_iname = iname;
}
inter_name *SharedVariables::frame_creator(shared_variable_set *set) {
return set->creator_fn_iname;
}
@ Returns the first variable in the set whose matching text begins |W|. Note
that this requires the match text to be nonempty, so it can only return
variables which have one.
=
shared_variable *SharedVariables::parse_match_clause(shared_variable_set *set,
wording W) {
shared_variable *shv;
LOOP_OVER_LINKED_LIST(shv, shared_variable, set->variables)
if (Wordings::starts_with(W, shv->match_wording_text))
return shv;
return NULL;
}
@h Access lists.
These could hardly be simpler:
=
typedef struct shared_variable_access_list {
struct linked_list *sets; /* of |shared_variable_set| */
CLASS_DEFINITION
} shared_variable_access_list;
shared_variable_access_list *SharedVariables::new_access_list(void) {
shared_variable_access_list *nshvol = CREATE(shared_variable_access_list);
nshvol->sets = NEW_LINKED_LIST(shared_variable_set);
return nshvol;
}
@ Duplicates are not allowed:
=
void SharedVariables::add_set_to_access_list(shared_variable_access_list *access,
shared_variable_set *set) {
if (access) {
shared_variable_set *existing;
LOOP_OVER_LINKED_LIST(existing, shared_variable_set, access->sets)
if (existing == set)
return;
ADD_TO_LINKED_LIST(set, shared_variable_set, access->sets);
}
}
@ This changes |access| to the union of |access| and |extras|:
=
void SharedVariables::append_access_list(shared_variable_access_list *access,
shared_variable_access_list *extras) {
shared_variable_set *set;
if ((extras) && (access))
LOOP_OVER_LINKED_LIST(set, shared_variable_set, extras->sets)
SharedVariables::add_set_to_access_list(access, set);
}
@ Returns the first shared variable of the given name |W| in any set in the
access list. This would be inefficient if access lists were ever large, or
if individual sets were, but they are not. Giving each access list its own
associative hash would make little or no saving of time, and would decrease
the predictability of results.
=
shared_variable *SharedVariables::parse_from_access_list(shared_variable_access_list *access,
wording W) {
if (Wordings::empty(W)) return NULL;
W = Articles::remove_the(W);
shared_variable_set *set;
if (access)
LOOP_OVER_LINKED_LIST(set, shared_variable_set, access->sets) {
shared_variable *shv;
LOOP_OVER_LINKED_LIST(shv, shared_variable, set->variables)
if (Wordings::match(shv->name, W))
return shv;
}
return NULL;
}

View file

@ -1,80 +1,55 @@
[Frames::] Stack Frames.
When Inform compiles phrase invocations, or implied forms of these
such as text substitutions, it does so in the context of a "stack frame".
This provides for local "let" values, manages loop blocks, and in general
looks after any information shared between a whole sequence of invocations.
When Inform compiles imperative code, it does so in the context of a "stack frame".
@ As we've seen, each phrase has its own stack frame, which is a structure
inside the |phrase| structure. But they can also exist independently, for
other occasions when compilation occurs. They keep track of which variables
are visible, and also of the current values of the kind variables A to Z,
if any, and the consequent return kind.
@h Introduction.
The term "stack frame" is traditional in computer science. The idea is that
there is a stack holding temporary data needed by the functions currently
running. Each function, as it begins, claims a "frame" of memory on the stack,
thus pushing the stack higher; when it ends, the memory in that frame is
given up. It can thus be used only for temporary data.
Our object code, Inter, is designed for use with virtual machines on which the
call stack is not directly addressable, so the term "stack frame" here is used
a little loosely. What we mean is: the collection of everything that is distinctive
about the function currently being compiled. In particular:
(*) its local variables;
(*) what shared variables it can see;
(*) what interpretations to place on the kind variables |A| to |Z|, if any;
(*) what kind of value we should be returning, if anything.
@ Code can only be compiled "inside" a stack frame, and at any given time
(when code is being comoiled, anyway) there is a "current" frame.
=
typedef struct ph_stack_frame {
struct locals_slate local_value_variables; /* those in scope here */
struct stacked_variable_access_list *local_stvol; /* those in scope here */
struct pointer_allocation *allocated_pointers;
int no_formal_parameters_needed; /* usually 0, unless there are ambiguities */
stack_frame *current_frame = NULL;
struct kind *kind_returned; /* or |NULL| for no return value */
struct kind **local_kind_variables; /* points to an array indexed 1 to 26 */
int determines_past_conditions; /* or rather, in the present, but for future use */
} ph_stack_frame;
@ Stack frames are often made fleetingly and then thrown away, but sometimes
we need to make one and keep it around. For this, we have the ability to box
up a stack frame: by allocating an instance of the following structure, we
can have a permanently valid pointer to a unique new PHSF.
=
typedef struct ph_stack_frame_box {
struct ph_stack_frame boxed_phsf;
CLASS_DEFINITION
} ph_stack_frame_box;
@ Within each stack frame is a linked list of notes about pointer values
for which memory allocation and deallocation will be needed:
=
typedef struct pointer_allocation {
struct heap_allocation allocation; /* needed to compile a function call returning a pointer to a new value */
struct text_stream *local_reference_code; /* an I6 lvalue for the storage holding the pointer */
struct text_stream *escaped_local_reference_code; /* the same, but suitable for schema use */
struct text_stream *schema_for_promotion; /* an I6 schema for promoting this value */
int offset_index; /* start of small block wrt current stack frame */
int offset_past; /* just past the end of the small block */
struct pointer_allocation *next_in_frame; /* within the linked list */
CLASS_DEFINITION
} pointer_allocation;
@h Creation.
A completely black stack frame...
=
ph_stack_frame Frames::new(void) {
ph_stack_frame phsf;
phsf.local_value_variables = LocalVariables::blank_slate();
phsf.local_kind_variables = NULL;
phsf.local_stvol = NULL;
phsf.determines_past_conditions = FALSE;
phsf.allocated_pointers = NULL;
phsf.kind_returned = NULL;
phsf.no_formal_parameters_needed = 0;
return phsf;
stack_frame *Frames::current_stack_frame(void) {
return current_frame;
}
@ ...can be useful all by itself. The following is used to make a temporary
stack frame suitable for "nonphrasal" compilation, that is, for when Inform
wants to compile an I6 routine for some purpose other than to define a phrase.
@ This must be imposed and removed manually:
=
void Frames::make_current(stack_frame *frame) {
if (frame == NULL) internal_error("can't select null stack frame");
current_frame = frame;
}
void Frames::remove_current(void) {
current_frame = NULL;
}
@ There are three ways to get stack frames. First, every phrase or rule has
one of its own. Second, though, we will also need a stack frame in order to
compile the many functions which aren't directly corresponding to phrases or
rules at all. Such a frame is called "nonphrasal":
=
int nonphrasal_stack_frame_is_current = FALSE;
ph_stack_frame nonphrasal_stack_frame;
stack_frame nonphrasal_stack_frame;
ph_stack_frame *Frames::new_nonphrasal(void) {
stack_frame *Frames::new_nonphrasal(void) {
if (nonphrasal_stack_frame_is_current)
internal_error("can't nest nonphrasal stack frames");
nonphrasal_stack_frame = Frames::new();
@ -89,52 +64,69 @@ void Frames::remove_nonphrase_stack_frame(void) {
Frames::remove_current();
}
@ Another way to get hold of a PHSF is to request a boxed one, as noted above:
@ //stack_frame// is a small and potentially throwaway structure, and can
sometimes exist only fleetingly in the compiler. If we want to preserve it,
or take a snapshot of its current state, we need to make a "boxed" copy, and
this is the third sort of stack frame which exists.
The following does so. //stack_frame_box// objects provide a convenient permanent
place in memory to stash these; pointers to them otherwise don't exist.
=
ph_stack_frame *Frames::boxed_frame(ph_stack_frame *phsf) {
if (phsf == NULL) return NULL;
ph_stack_frame_box *phsfb;
phsfb = CREATE(ph_stack_frame_box);
phsfb->boxed_phsf = *phsf;
LocalVariables::deep_copy_locals_slate(&(phsfb->boxed_phsf.local_value_variables),
&(phsf->local_value_variables));
return &(phsfb->boxed_phsf);
typedef struct stack_frame_box {
struct stack_frame boxed_phsf;
CLASS_DEFINITION
} stack_frame_box;
stack_frame *Frames::boxed_frame(stack_frame *old_frame) {
if (old_frame == NULL) return NULL;
stack_frame_box *box = CREATE(stack_frame_box);
stack_frame *new_frame = &(box->boxed_phsf);
*new_frame = *old_frame;
LocalVariables::deep_copy_locals_slate(&(new_frame->local_value_variables),
&(old_frame->local_value_variables));
return new_frame;
}
@h The current stack frame.
At any given time, a single stack frame is valid for local variable names
and phrase option names used as conditions. It will be the nonphrasal one
if that's active, and otherwise must be set as needed.
@h Creation.
=
ph_stack_frame *current_frame = NULL;
typedef struct stack_frame {
struct locals_slate local_value_variables; /* those in scope here */
struct shared_variable_access_list *shared_variables; /* those in scope here */
struct linked_list *local_block_values; /* of |local_block_value| */
int no_formal_parameters_needed; /* usually 0, unless there are ambiguities */
ph_stack_frame *Frames::current_stack_frame(void) {
return current_frame;
}
struct kind *kind_returned; /* or |NULL| for no return value */
struct kind **local_kind_variables; /* points to an array indexed 1 to 26 */
void Frames::make_current(ph_stack_frame *phsf) {
if (phsf == NULL) internal_error("can't select null stack frame");
current_frame = phsf;
}
int determines_past_conditions; /* or rather, in the present, but for future use */
} stack_frame;
void Frames::remove_current(void) {
current_frame = NULL;
stack_frame Frames::new(void) {
stack_frame frame;
frame.local_value_variables = LocalVariables::blank_slate();
frame.local_kind_variables = NULL;
frame.shared_variables = NULL;
frame.determines_past_conditions = FALSE;
frame.local_block_values = NEW_LINKED_LIST(local_block_value);
frame.kind_returned = NULL;
frame.no_formal_parameters_needed = 0;
return frame;
}
@h Kinds.
The kind of value we expect to return from within this stack frame, if any.
=
void Frames::set_kind_returned(ph_stack_frame *phsf, kind *K) {
phsf->kind_returned = K;
void Frames::set_kind_returned(stack_frame *frame, kind *K) {
frame->kind_returned = K;
}
kind *Frames::get_kind_returned(void) {
ph_stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) return NULL;
return phsf->kind_returned;
stack_frame *frame = Frames::current_stack_frame();
if (frame == NULL) return NULL;
return frame->kind_returned;
}
@ And the values of the kind variables A to Z:
@ -142,69 +134,233 @@ kind *Frames::get_kind_returned(void) {
@d KIND_VARIABLE_FROM_CONTEXT Frames::get_kind_variable
=
void Frames::set_kind_variables(ph_stack_frame *phsf, kind **vars) {
phsf->local_kind_variables = vars;
void Frames::set_kind_variables(stack_frame *frame, kind **vars) {
frame->local_kind_variables = vars;
}
kind *Frames::get_kind_variable(int N) {
ph_stack_frame *phsf = Frames::current_stack_frame();
if ((phsf) && (phsf->local_kind_variables))
return phsf->local_kind_variables[N];
stack_frame *frame = Frames::current_stack_frame();
if ((frame) && (frame->local_kind_variables))
return frame->local_kind_variables[N];
return NULL;
}
kind **Frames::temporarily_set_kvs(kind **vars) {
ph_stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) return NULL;
kind **prev = phsf->local_kind_variables;
phsf->local_kind_variables = vars;
stack_frame *frame = Frames::current_stack_frame();
if (frame == NULL) return NULL;
kind **prev = frame->local_kind_variables;
frame->local_kind_variables = vars;
return prev;
}
@h Stacked variables.
@h Shared variables.
See //Shared Variables// for more on this.
=
void Frames::set_stvol(ph_stack_frame *phsf, stacked_variable_access_list *stvol) {
phsf->local_stvol = stvol;
void Frames::set_shared_variable_access_list(stack_frame *frame,
shared_variable_access_list *access) {
frame->shared_variables = access;
}
stacked_variable_access_list *Frames::get_stvol(void) {
ph_stack_frame *phsf = Frames::current_stack_frame();
if (phsf) return phsf->local_stvol;
shared_variable_access_list *Frames::get_shared_variable_access_list(void) {
stack_frame *frame = Frames::current_stack_frame();
if (frame) return frame->shared_variables;
return NULL;
}
@h Past tense.
All we do here is to make a note if anything compiled in this context makes
reference to the past.
It turns out to be convenient to remember whether the current function makes
any reference to the past, which we do here:
=
void Frames::determines_the_past(void) {
ph_stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) internal_error(
stack_frame *frame = Frames::current_stack_frame();
if (frame == NULL) internal_error(
"tried to determine past where no stack frame exists");
phsf->determines_past_conditions = TRUE;
frame->determines_past_conditions = TRUE;
LOGIF(LOCAL_VARIABLES, "Stack frame determines past\n");
}
int Frames::used_for_past_tense(void) {
ph_stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) return FALSE;
if (phsf->determines_past_conditions) return TRUE;
stack_frame *frame = Frames::current_stack_frame();
if (frame == NULL) return FALSE;
if (frame->determines_past_conditions) return TRUE;
return FALSE;
}
@h Formal parameters.
Some stack frames need access to additional Inter function parameters to handle
runtime invocation ambiguities, and this is how they're requested:
=
void Frames::need_at_least_this_many_formals(int N) {
stack_frame *frame = Frames::current_stack_frame();
if (frame == NULL)
internal_error("requested formal parameters outside all stack frames");
if (N > frame->no_formal_parameters_needed)
frame->no_formal_parameters_needed = N;
}
@h Local block values.
Simple data at runtime, such as values of |K_number| or |K_truth_state|, occupy
a single Inter word. More involved data, such as values of |K_text| or
|K_stored_action|, cannot. Those are called "block values", because they occupy
entire multiple-word blocks of memory to store.
So when such data must be stored in a local variable, or some other memory location,
we will store the data itself if the kind is sufficiently simple, but a pointer
to an appropriate block of memory if not.
This is a particular issue for functions whose local variables need to have
block-value kinds, because that means the function must allocate suitable memory
when called and deallocate it on exit. Each stack frame must therefore track
what local block values it will need:
=
local_block_value *Frames::allocate_local_block_value(kind *K) {
stack_frame *frame = Frames::current_stack_frame();
if (frame == NULL)
internal_error("tried to allocate block kind outside all stack frames");
local_block_value *last =
LAST_IN_LINKED_LIST(local_block_value, frame->local_block_values);
local_block_value *bv = Frames::new_lbv(K, last);
ADD_TO_LINKED_LIST(bv, local_block_value, frame->local_block_values);
return bv;
}
int Frames::uses_local_block_values(stack_frame *frame) {
if ((frame) && (LinkedLists::len(frame->local_block_values) > 0)) return TRUE;
return FALSE;
}
@ Where should temporary block values live, during the perhaps very brief
period while a function is running? We can't put it onto the virtual machine's
call stack, because it doesn't live in the VM's memory at all, and therefore
cannot be written or read. We could put it on the heap, but then allocation
and deallocation would be expensive.
Instead we put just the small blocks on a stack in memory: it fills downwards,
and at runtime the Inter identifier |I7SFRAME| points to the current and therefore
bottom-most frame on this stack. So, for example, if the current stack frame has
just two local block values, a |K_text| and a |K_stored_action|, then we would have:
= (text)
...free space...
I7SFRAME --> 0 } small block 0 (for a K_text), offset index 0
1 } may then --> more data on the heap offset past 2
2 } small block 1 (for a K_stored_action) offset index 2
3 } similarly --> more data on the heap offset past 8
4 }
5 }
6 }
7 }
...frames belonging to functions calling this one...
=
These small blocks may well point to larger blocks elsewhere on the heap (for
example, to accommodate the actual contents of a text, if they are non-constant).
But small blocks have the virtue of being of a size which is fixed for each
kind, and we can allocate space for them essentially immediately just by raising
the |I7SFRAME| sufficiently.
Each local block value is kept track of with one of these:
=
typedef struct local_block_value {
struct heap_allocation allocation; /* needed to compile a function call returning a pointer to a new value */
struct i6_schema *to_refer; /* a schema to access this data */
int offset_index; /* start of small block wrt current stack frame */
int offset_past; /* just past the end of the small block */
CLASS_DEFINITION
} local_block_value;
@ Note that the schemas below for calculating offset positions from |I7SFRAME|
will end up only as a single addition at runtime, because the multiplication of
|WORDSIZE| by a literal positive integer will be constant-folded in code
generation.
=
local_block_value *Frames::new_lbv(kind *K, local_block_value *last) {
local_block_value *bv = CREATE(local_block_value);
if (last == NULL) bv->offset_index = 0;
else bv->offset_index = last->offset_past;
bv->allocation = RTKinds::make_heap_allocation(K, 0, bv->offset_index);
bv->offset_past = bv->offset_index + Kinds::Behaviour::get_small_block_size(K);
TEMPORARY_TEXT(ref)
if (bv->offset_index == 0) {
WRITE_TO(ref, "I7SFRAME");
} else if (bv->offset_index == 1) {
WRITE_TO(ref, "(I7SFRAME+WORDSIZE)");
} else {
WRITE_TO(ref, "(I7SFRAME+WORDSIZE**%d)", bv->offset_index);
}
bv->to_refer = Calculus::Schemas::new("%S", ref);
DISCARD_TEXT(ref)
return bv;
}
@ The following code is executed when the stack frame is entered: we push the
old value of |I7SFRAME_HL| to the call stack to save it; then call a function
in //BasicInformKit: BlockValues// to make space for the small
blocks we need, which will move |I7SFRAME_HL| downwards by |size| words; and
then initialise the small blocks one by one to default values.
=
void Frames::compile_lbv_setup(stack_frame *frame) {
Produce::push(Emit::tree(), Hierarchy::find(I7SFRAME_HL));
int size = 0;
local_block_value *lbv;
LOOP_OVER_LINKED_LIST(lbv, local_block_value, frame->local_block_values) {
if (lbv->offset_past > size) size = lbv->offset_past;
}
Produce::inv_call_iname(Emit::tree(), Hierarchy::find(STACKFRAMECREATE_HL));
Produce::down(Emit::tree());
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, (inter_ti) size);
Produce::up(Emit::tree());
LOOP_OVER_LINKED_LIST(lbv, local_block_value, frame->local_block_values)
RTKinds::emit_heap_allocation(lbv->allocation);
}
@ Symmetrically, this teardown code is executed when the stack frame is exited.
We deallocate each small block, and then restore |I7SFRAME_HL| by pulling the
value we pushed earlier.
=
void Frames::compile_lbv_teardown(stack_frame *frame) {
local_block_value *lbv;
LOOP_OVER_LINKED_LIST(lbv, local_block_value, frame->local_block_values) {
inter_name *iname = Hierarchy::find(BLKVALUEFREEONSTACK_HL);
Produce::inv_call_iname(Emit::tree(), iname);
Produce::down(Emit::tree());
Produce::val(Emit::tree(), K_value, LITERAL_IVAL, (inter_ti) lbv->offset_index);
Produce::up(Emit::tree());
}
Produce::pull(Emit::tree(), Hierarchy::find(I7SFRAME_HL));
}
@ The net effect is that when the rest of Inform needs to compile the address
of a newly-allocated value of a block kind |K|, it can simply call the
following, without having to worry about how any of this works:
=
void Frames::emit_new_local_value(kind *K) {
local_block_value *bv = Frames::allocate_local_block_value(K);
EmitSchemas::emit_expand_from_terms(bv->to_refer, NULL, NULL, FALSE);
}
@h Logging.
=
void Frames::log(ph_stack_frame *phsf) {
if (phsf == NULL) { LOG("<null stack frame>\n"); return; }
void Frames::log(stack_frame *frame) {
if (frame == NULL) { LOG("<null stack frame>\n"); return; }
LOG("Stack frame at %08x: it:%s, dpc:%s\n",
phsf,
(phsf->local_value_variables.it_variable_exists)?"yes":"no",
(phsf->determines_past_conditions)?"yes":"no");
frame,
(frame->local_value_variables.it_variable_exists)?"yes":"no",
(frame->determines_past_conditions)?"yes":"no");
local_variable *lvar;
LOOP_THROUGH_LOCALS_IN_FRAME(lvar, phsf) {
LOOP_THROUGH_LOCALS_IN_FRAME(lvar, frame) {
switch (lvar->lv_purpose) {
case LET_VALUE_LV: LOG("Let/loop value: "); break;
case TOKEN_CALL_PARAMETER_LV: LOG("Call value: "); break;
@ -215,101 +371,3 @@ void Frames::log(ph_stack_frame *phsf) {
LocalVariables::log(lvar); LOG("\n");
}
}
@h Formal parameter allocation.
Some stack frames need access to additional variables to handle run-time
invocation ambiguities, and this is how they're requested:
=
void Frames::need_at_least_this_many_formals(int N) {
ph_stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL)
internal_error("requested formal parameters outside all stack frames");
if (N > phsf->no_formal_parameters_needed)
phsf->no_formal_parameters_needed = N;
}
@h Pointer value allocation.
Values such as lists, which have to stored in whole blocks rather than single
words of memory, are sometimes called pointer values because all we can
immediately handle is a pointer to the block. When these arise in the
compilation of a routine, we have to make a note of this, because special
code will be needed to allocate and deallocate the memory storing the block.
The following is the routine called to make this note.
=
pointer_allocation *Frames::add_allocation(kind *K, char *proto) {
ph_stack_frame *phsf = Frames::current_stack_frame();
if (phsf == NULL) {
LOG("Tried to allocate: %u\n", K);
internal_error("tried to allocate block kind outside all stack frames");
}
pointer_allocation *pall = CREATE(pointer_allocation);
pall->next_in_frame = phsf->allocated_pointers;
phsf->allocated_pointers = pall;
if (pall->next_in_frame == NULL) pall->offset_index = 0;
else pall->offset_index = pall->next_in_frame->offset_past;
pall->offset_past = pall->offset_index + Kinds::Behaviour::get_small_block_size(K);
@<Work out heap allocation code for this pointer value@>;
@<Work out local reference code for this pointer value@>;
@<Work out promotion schema for this pointer value@>;
return pall;
}
void Frames::compile_allocation(OUTPUT_STREAM, kind *K) {
pointer_allocation *pall = Frames::add_allocation(K, NULL);
WRITE("%S", Frames::pall_get_local_reference(pall));
}
void Frames::emit_allocation(kind *K) {
pointer_allocation *pall = Frames::add_allocation(K, NULL);
i6_schema *all_sch = Calculus::Schemas::new("%S", pall->escaped_local_reference_code);
EmitSchemas::emit_expand_from_terms(all_sch, NULL, NULL, FALSE);
}
@ The following works out a call to |BlkValueCreate| which will return a
default value of the given kind.
@<Work out heap allocation code for this pointer value@> =
pall->allocation = RTKinds::make_heap_allocation(K, 0, pall->offset_index);
@ This is the storage used to hold the pointer. For each frame, we have
a subarray of short blocks, indexed by the offset.
@<Work out local reference code for this pointer value@> =
pall->local_reference_code = Str::new();
pall->escaped_local_reference_code = Str::new();
if (pall->offset_index == 0) {
WRITE_TO(pall->local_reference_code, "I7SFRAME");
WRITE_TO(pall->escaped_local_reference_code, "I7SFRAME");
} else if (pall->offset_index == 1) {
WRITE_TO(pall->local_reference_code, "(I7SFRAME+WORDSIZE)");
WRITE_TO(pall->escaped_local_reference_code, "(I7SFRAME+WORDSIZE)");
} else {
WRITE_TO(pall->local_reference_code, "(I7SFRAME+WORDSIZE*%d)", pall->offset_index);
WRITE_TO(pall->escaped_local_reference_code, "(I7SFRAME+WORDSIZE**%d)", pall->offset_index);
}
@<Work out promotion schema for this pointer value@> =
pall->schema_for_promotion = Str::new();
if (proto) {
for (int i=0; proto[i]; i++) {
if ((proto[i] == '*') && (proto[i+1] == '#') && (proto[i+2] == '#')) {
WRITE_TO(pall->schema_for_promotion, "%S", pall->escaped_local_reference_code);
i+=2;
continue;
}
PUT_TO(pall->schema_for_promotion, proto[i]);
}
}
@ =
text_stream *Frames::pall_get_local_reference(pointer_allocation *pall) {
return pall->local_reference_code;
}
text_stream *Frames::pall_get_expanded_schema(pointer_allocation *pall) {
return pall->schema_for_promotion;
}

View file

@ -1,247 +0,0 @@
[StackedVariables::] Stacked Variables.
To permit variables to have scopes intermediate between local and
global: for example, to be shared by all rules in a given rulebook.
@h Definitions.
=
typedef struct stacked_variable {
struct wording name; /* text of the name */
struct parse_node *assigned_at; /* sentence assigning it */
struct nonlocal_variable *underlying_var; /* the variable in question */
int owner_id; /* who owns this */
int offset_in_owning_frame; /* word offset of storage (counts from 0) */
struct wording match_wording_text; /* matching text (relevant for action variables only) */
CLASS_DEFINITION
} stacked_variable;
typedef struct stacked_variable_set {
int no_stvs;
int recognition_id;
struct linked_list *list_of_stvs; /* of |stacked_variable| */
struct inter_name *creator_fn_iname;
CLASS_DEFINITION
} stacked_variable_set;
typedef struct stacked_variable_access_list {
struct linked_list *sets; /* of |stacked_variable_set| */
CLASS_DEFINITION
} stacked_variable_access_list;
@
= (early code)
int max_frame_size_needed = 0;
@ =
int StackedVariables::get_owner_id(stacked_variable *stv) {
return stv->owner_id;
}
int StackedVariables::get_offset(stacked_variable *stv) {
return stv->offset_in_owning_frame;
}
kind *StackedVariables::get_kind(stacked_variable *stv) {
nonlocal_variable *nlv = StackedVariables::get_variable(stv);
return NonlocalVariables::kind(nlv);
}
nonlocal_variable *StackedVariables::get_variable(stacked_variable *stv) {
if (stv == NULL) return NULL;
return stv->underlying_var;
}
void StackedVariables::set_matching_text(stacked_variable *stv, wording W) {
stv->match_wording_text = W;
}
wording StackedVariables::get_matching_text(stacked_variable *stv) {
return stv->match_wording_text;
}
stacked_variable *StackedVariables::parse_match_clause(stacked_variable_set *set,
wording W) {
stacked_variable *stv;
LOOP_OVER_LINKED_LIST(stv, stacked_variable, set->list_of_stvs)
if (Wordings::starts_with(W, stv->match_wording_text))
return stv;
return NULL;
}
stacked_variable_set *StackedVariables::new_set(int id) {
stacked_variable_set *set = CREATE(stacked_variable_set);
set->recognition_id = id;
set->no_stvs = 0;
set->list_of_stvs = NEW_LINKED_LIST(stacked_variable);
set->creator_fn_iname = NULL;
return set;
}
int StackedVariables::set_empty(stacked_variable_set *set) {
if (set->no_stvs == 0) return TRUE;
return FALSE;
}
stacked_variable *StackedVariables::add_empty(stacked_variable_set *set,
wording W, kind *K) {
stacked_variable *stv = CREATE(stacked_variable);
nonlocal_variable *q;
W = Articles::remove_the(W);
stv->name = W;
stv->owner_id = set->recognition_id;
stv->offset_in_owning_frame = set->no_stvs++;
stv->assigned_at = current_sentence;
stv->match_wording_text = EMPTY_WORDING;
ADD_TO_LINKED_LIST(stv, stacked_variable, set->list_of_stvs);
if (set->no_stvs > max_frame_size_needed)
max_frame_size_needed = set->no_stvs;
q = NonlocalVariables::new_with_scope(W, K, stv);
stv->underlying_var = q;
RTVariables::set_I6_identifier(q, FALSE, RTVariables::stv_rvalue(stv));
RTVariables::set_I6_identifier(q, TRUE, RTVariables::stv_lvalue(stv));
return stv;
}
stacked_variable_access_list *StackedVariables::new_access_list(void) {
stacked_variable_access_list *nstvol = CREATE(stacked_variable_access_list);
nstvol->sets = NEW_LINKED_LIST(stacked_variable_set);
return nstvol;
}
void StackedVariables::add_set_to_access_list(stacked_variable_access_list *access,
stacked_variable_set *set) {
if (access) {
stacked_variable_set *existing;
LOOP_OVER_LINKED_LIST(existing, stacked_variable_set, access->sets)
if (existing == set)
return;
ADD_TO_LINKED_LIST(set, stacked_variable_set, access->sets);
}
}
void StackedVariables::append_access_list(stacked_variable_access_list *access,
stacked_variable_access_list *extras) {
stacked_variable_set *set;
if ((extras) && (access))
LOOP_OVER_LINKED_LIST(set, stacked_variable_set, extras->sets)
StackedVariables::add_set_to_access_list(access, set);
}
void StackedVariables::index_owner(OUTPUT_STREAM, stacked_variable_set *set) {
stacked_variable *stv;
LOOP_OVER_LINKED_LIST(stv, stacked_variable, set->list_of_stvs)
if (stv->underlying_var) {
HTML::open_indented_p(OUT, 2, "tight");
IXVariables::index_one(OUT, stv->underlying_var);
HTML_CLOSE("p");
}
}
stacked_variable *StackedVariables::parse_from_access_list(stacked_variable_access_list *access,
wording W) {
if (Wordings::empty(W)) return NULL;
W = Articles::remove_the(W);
stacked_variable_set *set;
if (access)
LOOP_OVER_LINKED_LIST(set, stacked_variable_set, access->sets) {
stacked_variable *stv = StackedVariables::parse_from_list(set->list_of_stvs, W);
if (stv) return stv;
}
return NULL;
}
stacked_variable *StackedVariables::parse_from_list(linked_list *stvl, wording W) {
stacked_variable *stv;
LOOP_OVER_LINKED_LIST(stv, stacked_variable, stvl)
if (Wordings::match(stv->name, W))
return stv;
return NULL;
}
int StackedVariables::compile_frame_creator(stacked_variable_set *set, inter_name *iname) {
if (set == NULL) return 0;
packaging_state save = Routines::begin(iname);
inter_symbol *pos_s = LocalVariables::add_named_call_as_symbol(I"pos");
inter_symbol *state_s = LocalVariables::add_named_call_as_symbol(I"state");
Produce::inv_primitive(Emit::tree(), IFELSE_BIP);
Produce::down(Emit::tree());
Produce::inv_primitive(Emit::tree(), EQ_BIP);
Produce::down(Emit::tree());
Produce::val_symbol(Emit::tree(), K_value, state_s);
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, 1);
Produce::up(Emit::tree());
Produce::code(Emit::tree());
Produce::down(Emit::tree());
@<Compile frame creator if state is set@>;
Produce::up(Emit::tree());
Produce::code(Emit::tree());
Produce::down(Emit::tree());
@<Compile frame creator if state is clear@>;
Produce::up(Emit::tree());
Produce::up(Emit::tree());
int count = LinkedLists::len(set->list_of_stvs);
Produce::inv_primitive(Emit::tree(), RETURN_BIP);
Produce::down(Emit::tree());
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, (inter_ti) count);
Produce::up(Emit::tree());
Routines::end(save);
set->creator_fn_iname = iname;
return count;
}
@<Compile frame creator if state is set@> =
stacked_variable *stv;
LOOP_OVER_LINKED_LIST(stv, stacked_variable, set->list_of_stvs) {
nonlocal_variable *q = StackedVariables::get_variable(stv);
kind *K = NonlocalVariables::kind(q);
Produce::inv_primitive(Emit::tree(), STORE_BIP);
Produce::down(Emit::tree());
Produce::inv_primitive(Emit::tree(), LOOKUPREF_BIP);
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_value, Hierarchy::find(MSTACK_HL));
Produce::val_symbol(Emit::tree(), K_value, pos_s);
Produce::up(Emit::tree());
if (Kinds::Behaviour::uses_pointer_values(K))
RTKinds::emit_heap_allocation(RTKinds::make_heap_allocation(K, 1, -1));
else
RTVariables::emit_initial_value_as_val(q);
Produce::up(Emit::tree());
Produce::inv_primitive(Emit::tree(), POSTINCREMENT_BIP);
Produce::down(Emit::tree());
Produce::ref_symbol(Emit::tree(), K_value, pos_s);
Produce::up(Emit::tree());
}
@<Compile frame creator if state is clear@> =
stacked_variable *stv;
LOOP_OVER_LINKED_LIST(stv, stacked_variable, set->list_of_stvs) {
nonlocal_variable *q = StackedVariables::get_variable(stv);
kind *K = NonlocalVariables::kind(q);
if (Kinds::Behaviour::uses_pointer_values(K)) {
Produce::inv_call_iname(Emit::tree(), Hierarchy::find(BLKVALUEFREE_HL));
Produce::down(Emit::tree());
Produce::inv_primitive(Emit::tree(), LOOKUP_BIP);
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_value, Hierarchy::find(MSTACK_HL));
Produce::val_symbol(Emit::tree(), K_value, pos_s);
Produce::up(Emit::tree());
Produce::up(Emit::tree());
}
Produce::inv_primitive(Emit::tree(), POSTINCREMENT_BIP);
Produce::down(Emit::tree());
Produce::ref_symbol(Emit::tree(), K_value, pos_s);
Produce::up(Emit::tree());
}
@ =
inter_name *StackedVariables::frame_creator(stacked_variable_set *set) {
return set->creator_fn_iname;
}

View file

@ -106,7 +106,7 @@ void Specifications::Compiler::spec_compile_primitive(value_holster *VH, parse_n
if ((K) && (Kinds::Behaviour::uses_pointer_values(K))) {
Produce::inv_call_iname(Emit::tree(), Hierarchy::find(BLKVALUECOPY_HL));
Produce::down(Emit::tree());
Frames::emit_allocation(K);
Frames::emit_new_local_value(K);
dereffed = TRUE;
}
}

View file

@ -644,7 +644,7 @@ void Calculus::Deferrals::emit_call_to_deferred_desc(pcalc_prop *prop,
Produce::val_iname(Emit::tree(), K_value, pdef->ppd_iname);
Calculus::Deferrals::Cinders::find_emit(prop, pdef);
if (K) {
Frames::emit_allocation(K);
Frames::emit_new_local_value(K);
RTKinds::emit_strong_id_as_val(Kinds::unary_construction_material(K));
}
Produce::up(Emit::tree());
@ -661,7 +661,7 @@ void Calculus::Deferrals::emit_list_of_S(parse_node *spec, kind *K) {
if (Calculus::Deferrals::spec_is_variable_of_kind_description(spec)) {
Produce::inv_call_iname(Emit::tree(), Hierarchy::find(LIST_OF_TY_DESC_HL));
Produce::down(Emit::tree());
Frames::emit_allocation(K);
Frames::emit_new_local_value(K);
Specifications::Compiler::emit_as_val(K_value, spec);
RTKinds::emit_strong_id_as_val(Kinds::unary_construction_material(K));
Produce::up(Emit::tree());

View file

@ -77,7 +77,7 @@ then follow, and finally the optional bitmap of phrase options.
@<Emit the comma-separated list of arguments@> =
if (Kinds::Behaviour::uses_pointer_values(return_kind))
Frames::emit_allocation(return_kind);
Frames::emit_new_local_value(return_kind);
for (int k=0; k<tokens->tokens_count; k++)
Specifications::Compiler::emit_to_kind(tokens->args[k], tokens->kind_required[k]);
if (phrase_options != -1)

View file

@ -97,7 +97,7 @@ checker has already done all of the work to decide what kind it has.)
Produce::inv_primitive(Emit::tree(), STORE_BIP);
Produce::down(Emit::tree());
Produce::ref_symbol(Emit::tree(), K_value, lvar_s);
Frames::emit_allocation(K);
Frames::emit_new_local_value(K);
Produce::up(Emit::tree());
}
@ -201,7 +201,7 @@ the fixed text "phrase options" expands to the whole bitmap.
=
<name-local-to-inline-stack-frame> internal {
local_variable *lvar = LocalVariables::parse(&(idb_being_parsed->compilation_data.stack_frame), W);
local_variable *lvar = LocalVariables::parse(&(idb_being_parsed->compilation_data.id_stack_frame), W);
if (lvar) {
==> { -, lvar };
return TRUE;
@ -370,7 +370,7 @@ its own when kind variables are in play.
@<Inline command "new"@> =
kind *K = Invocations::Inline::parse_bracing_operand_as_kind(sche->operand, Node::get_kind_variable_declarations(inv));
if (Kinds::Behaviour::uses_pointer_values(K)) Frames::emit_allocation(K);
if (Kinds::Behaviour::uses_pointer_values(K)) Frames::emit_new_local_value(K);
else if (K == NULL) @<Issue an inline no-such-kind problem@>
else if (RTKinds::emit_default_value_as_val(K, EMPTY_WORDING, NULL) == FALSE)
@<Issue problem for no natural choice@>;
@ -1567,7 +1567,7 @@ parse_node *Invocations::Inline::parse_bracing_operand_as_identifier(text_stream
lvar = my_vars[Str::get_at(operand, 0) - '0'];
else {
wording LW = Feeds::feed_text(operand);
lvar = LocalVariables::parse(&(idb->compilation_data.stack_frame), LW);
lvar = LocalVariables::parse(&(idb->compilation_data.id_stack_frame), LW);
if (lvar) {
int tok = LocalVariables::get_parameter_number(lvar);
if (tok >= 0) return tokens->args[tok];

View file

@ -24,7 +24,7 @@ should always be supplied for "To..." phrases, but left null for rules.
=
void Routines::Compile::routine(id_body *idb,
stacked_variable_access_list *legible, to_phrase_request *req,
shared_variable_access_list *legible, to_phrase_request *req,
rule *R) {
parse_node *code_at = ImperativeDefinitions::body_at(idb);
if (Node::is(code_at->next, DEFN_CONT_NT)) code_at = code_at->next;
@ -36,7 +36,7 @@ void Routines::Compile::routine(id_body *idb,
@<Compile some commentary about the routine to follow@>;
packaging_state save = Routines::begin_framed(Routines::Compile::iname(idb, req), &(idb->compilation_data.stack_frame));
packaging_state save = Routines::begin_framed(Routines::Compile::iname(idb, req), &(idb->compilation_data.id_stack_frame));
@<Compile the body of the routine@>;
@ -52,7 +52,7 @@ void Routines::Compile::routine(id_body *idb,
ImperativeDefinitions::write_comment_describing(idb->head_of_defn);
@<Set up the stack frame for this compilation request@> =
ph_stack_frame *phsf = &(idb->compilation_data.stack_frame);
stack_frame *phsf = &(idb->compilation_data.id_stack_frame);
id_type_data *idtd = &(idb->type_data);
Frames::make_current(phsf);
@ -65,7 +65,7 @@ void Routines::Compile::routine(id_body *idb,
PhraseRequests::kind_variables_for_request(req));
else Frames::set_kind_variables(phsf, NULL);
Frames::set_stvol(phsf, legible);
Frames::set_shared_variable_access_list(phsf, legible);
LocalVariables::deallocate_all(phsf); /* in case any are left from an earlier compile */
PreformCache::warn_of_changes(); /* that local variables may have changed */

View file

@ -13,7 +13,7 @@ Chapter 1: Configuration and Control
Chapter 2: Compilation Context
"Preparing a context at run-time in which code can be executed."
Local Variables
Stacked Variables
Shared Variables
Phrase Blocks
Stack Frames
Chronology

View file

@ -66,3 +66,13 @@ void IXVariables::index_one(OUTPUT_STREAM, nonlocal_variable *nlv) {
Kinds::Textual::write(OUT, nlv->nlv_kind);
WRITE("</i>");
}
void IXVariables::index_stv_set(OUTPUT_STREAM, shared_variable_set *set) {
shared_variable *stv;
LOOP_OVER_LINKED_LIST(stv, shared_variable, set->variables)
if (stv->underlying_var) {
HTML::open_indented_p(OUT, 2, "tight");
IXVariables::index_one(OUT, stv->underlying_var);
HTML_CLOSE("p");
}
}

View file

@ -122,9 +122,9 @@ int IXActions::index(OUTPUT_STREAM, action_name *an, int pass,
if (CommandsIndex::index_list_with_action(OUT, an->command_parser_grammar_producing_this) == FALSE)
WRITE("<i>None</i>");
HTML_CLOSE("p");
if (StackedVariables::set_empty(an->action_variables) == FALSE) {
if (SharedVariables::set_empty(an->action_variables) == FALSE) {
HTML_OPEN("p"); WRITE("<b>Named values belonging to this action</b>\n"); HTML_CLOSE("p");
StackedVariables::index_owner(OUT, an->action_variables);
IXVariables::index_stv_set(OUT, an->action_variables);
}
HTML_OPEN("p"); WRITE("<b>Rules controlling this action</b>"); HTML_CLOSE("p");

View file

@ -38,7 +38,7 @@ typedef struct nonlocal_variable {
struct wording name; /* text of the name */
struct kind *nlv_kind; /* what kind of value it holds */
struct stacked_variable *scope; /* where it exists, or |NULL| for everywhere */
struct shared_variable *scope; /* where it exists, or |NULL| for everywhere */
struct inference_subject *as_subject; /* so that assertions can discuss it... */
struct inference_subject *alias_subject; /* ...or perhaps the thing it aliases */
@ -63,7 +63,7 @@ reference to how it's stored at run-time.
Note that we only register the name of the variable as a proper noun if it's
global and will live forever, because nouns are both of those things. Anyone
creating a stacked variable will have to make their own arrangements to parse
creating a shared variable will have to make their own arrangements to parse
the names of them.
=
@ -91,16 +91,6 @@ nonlocal_variable *NonlocalVariables::parse_global(wording W) {
return NULL;
}
@ This one is unprotected, that is, can be called outside of asserting some
proposition; that's because variables with a finite lifetime are not part
of the model, since they do not exist at the start of play.
=
nonlocal_variable *NonlocalVariables::new_with_scope(wording W, kind *K,
stacked_variable *scope) {
return NonlocalVariables::new(W, K, scope);
}
@ We record the one most recently made:
=
@ -109,7 +99,7 @@ nonlocal_variable *NonlocalVariables::get_latest(void) {
return latest_nonlocal_variable;
}
nonlocal_variable *NonlocalVariables::new(wording W, kind *K, stacked_variable *scope) {
nonlocal_variable *NonlocalVariables::new(wording W, kind *K, shared_variable *shv) {
if (K == NULL) internal_error("created variable without kind");
if (Kinds::Behaviour::definite(K) == FALSE)
@<Issue problem message for an indefinite variable@>;
@ -123,7 +113,7 @@ nonlocal_variable *NonlocalVariables::new(wording W, kind *K, stacked_variable *
nlv->alias_subject = NULL;
nlv->constant_at_run_time = FALSE;
nlv->var_is_allowed_to_be_zero = FALSE;
nlv->scope = scope;
nlv->scope = shv;
nlv->substitution_marker = 0;
nlv->as_subject = VariableSubjects::new(nlv);
nlv->compilation_data = RTVariables::new_compilation_data();

View file

@ -37,7 +37,7 @@ int Phrases::Condition::claim_definition(adjective_meaning_family *f,
}
int Phrases::Condition::generate_in_support_function(adjective_meaning_family *family,
adjective_meaning *am, int T, int emit_flag, ph_stack_frame *phsf) {
adjective_meaning *am, int T, int emit_flag, stack_frame *phsf) {
definition *def = RETRIEVE_POINTER_definition(am->family_specific_data);
switch (T) {
case TEST_ATOM_TASK:

View file

@ -141,9 +141,10 @@ void RTActivities::Activity_atb_rulebooks_array(void) {
void RTActivities::activity_var_creators(void) {
activity *av;
LOOP_OVER(av, activity) {
if (StackedVariables::set_empty(av->activity_variables) == FALSE) {
if (SharedVariables::set_empty(av->activity_variables) == FALSE) {
inter_name *iname = Hierarchy::make_iname_in(ACTIVITY_STV_CREATOR_FN_HL, av->compilation_data.av_package);
StackedVariables::compile_frame_creator(av->activity_variables, iname);
SharedVariables::set_frame_creator(av->activity_variables, iname);
RTVariables::compile_frame_creator(av->activity_variables);
}
}
@ -151,8 +152,8 @@ void RTActivities::activity_var_creators(void) {
packaging_state save = Emit::named_array_begin(iname, K_value);
int c = 0;
LOOP_OVER(av, activity) {
if (StackedVariables::set_empty(av->activity_variables)) Emit::array_numeric_entry(0);
else Emit::array_iname_entry(StackedVariables::frame_creator(av->activity_variables));
if (SharedVariables::set_empty(av->activity_variables)) Emit::array_numeric_entry(0);
else Emit::array_iname_entry(SharedVariables::frame_creator(av->activity_variables));
c++;
}
Emit::array_numeric_entry(0);

View file

@ -157,7 +157,7 @@ have multiple definitions is "object", but that may change.
=
void RTAdjectives::list_compile(adjective *adj,
ph_stack_frame *phsf, kind *K, int T, inter_symbol *t0_s) {
stack_frame *phsf, kind *K, int T, inter_symbol *t0_s) {
adjective_meaning *am;
LOOP_OVER_LINKED_LIST(am, adjective_meaning, adj->adjective_meanings.in_precedence_order)
if ((AdjectiveMeanings::can_generate_in_support_function(am, T)) &&

View file

@ -25,7 +25,7 @@ typedef struct id_compilation_data {
int inter_defn_converted; /* has this been tried yet? */
struct inter_name *ph_iname; /* or NULL for inline phrases */
struct package_request *requests_package;
struct ph_stack_frame stack_frame;
struct stack_frame id_stack_frame;
int permit_all_outcomes; /* waive the usual restrictions on rule outcomes */
} id_compilation_data;
@ -44,7 +44,7 @@ id_compilation_data IDCompilation::new_data(parse_node *p) {
phcd.requests_package = NULL;
phcd.at_least_one_compiled_form_needed = TRUE;
phcd.compile_with_run_time_debugging = FALSE;
phcd.stack_frame = Frames::new();
phcd.id_stack_frame = Frames::new();
phcd.permit_all_outcomes = FALSE;
return phcd;
}
@ -60,10 +60,10 @@ void IDCompilation::make_inline(id_body *idb, int inline_wn, int mor) {
=
void IDCompilation::prepare_stack_frame(id_body *body) {
IDCompilation::initialise_stack_frame_from_type_data(
&(body->compilation_data.stack_frame), &(body->type_data),
&(body->compilation_data.id_stack_frame), &(body->type_data),
IDTypeData::kind(&(body->type_data)), TRUE);
if (PhraseOptions::allows_options(body))
LocalVariables::options_parameter_is_needed(&(body->compilation_data.stack_frame));
LocalVariables::options_parameter_is_needed(&(body->compilation_data.id_stack_frame));
}
@ Suppose Inform is compiling code to represent this:
@ -96,7 +96,7 @@ arguments, "number" and then "list of numbers", and creates local
variables "new entry" and "L" with those kinds.
=
void IDCompilation::initialise_stack_frame_from_type_data(ph_stack_frame *phsf,
void IDCompilation::initialise_stack_frame_from_type_data(stack_frame *phsf,
id_type_data *idtd, kind *kind_in_this_compilation, int first) {
if (Kinds::get_construct(kind_in_this_compilation) != CON_phrase)
internal_error("no function kind");
@ -171,7 +171,7 @@ response to "requests". All other phrases are compiled just once.
=
void IDCompilation::compile(id_body *idb, int *i, int max_i,
stacked_variable_access_list *legible, to_phrase_request *req, rule *R) {
shared_variable_access_list *legible, to_phrase_request *req, rule *R) {
if ((req) || (idb->compilation_data.at_least_one_compiled_form_needed)) {
Routines::Compile::routine(idb, legible, req, R);
if (idb->compilation_data.at_least_one_compiled_form_needed) {

View file

@ -1749,7 +1749,7 @@ void RTRelations::compile_routine_to_decide(inter_name *rname,
packaging_state save = Routines::begin(rname);
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
RTRelations::add_term_as_call_parameter(phsf, par1);
RTRelations::add_term_as_call_parameter(phsf, par2);
@ -1778,7 +1778,7 @@ its kind indications are all blank, but verifying that the value supplied
matches the specific necessary kind of object if there is one.
=
void RTRelations::add_term_as_call_parameter(ph_stack_frame *phsf,
void RTRelations::add_term_as_call_parameter(stack_frame *phsf,
bp_term_details bptd) {
kind *K = BPTerms::kind(&bptd);
kind *PK = K;

View file

@ -11,7 +11,7 @@ typedef struct response_message {
struct rule *responding_rule; /* named rule in which this response occurs */
int response_marker; /* 0 for A, 1 for B, and so on up */
struct text_substitution *original_text;
struct ph_stack_frame *original_stack_frame;
struct stack_frame *original_stack_frame;
struct inter_name *resp_iname;
struct inter_name *constant_iname;
struct package_request *resp_package;
@ -60,7 +60,7 @@ but also (in most cases) a |TX_S_*| text substitution routine.
=
response_message *Strings::response_cue(value_holster *VH, rule *owner, int marker,
wording W, ph_stack_frame *phsf, int via_I6) {
wording W, stack_frame *phsf, int via_I6) {
response_message *resp = CREATE(response_message);
resp->original_stack_frame = Frames::boxed_frame(phsf);
resp->responding_rule = owner;
@ -417,7 +417,7 @@ divided up by the extensions containing the rules which produce them.
}
@ =
ph_stack_frame *Strings::frame_for_response(response_message *resp) {
stack_frame *Strings::frame_for_response(response_message *resp) {
if (resp == NULL) return NULL;
return resp->original_stack_frame;
}
@ -528,7 +528,7 @@ so the penultimate word, if it's there, is the letter.
"some text as a response, then it can only occur once in its rule.");
return;
}
ph_stack_frame *phsf = Frames::current_stack_frame();
stack_frame *phsf = Frames::current_stack_frame();
if (Holsters::data_acceptable(VH)) {
int downs = LocalVariables::emit_storage(phsf);
response_message *resp =

Some files were not shown because too many files have changed in this diff Show more