1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-01 07:48:35 +03:00

Began move of phrase code

This commit is contained in:
Graham Nelson 2021-03-28 11:47:28 +01:00
parent b21a194644
commit 6a69f25bef
59 changed files with 1664 additions and 1852 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
v10.1.0-alpha.1+6R63 'Krypton' (27 March 2021)
v10.1.0-alpha.1+6R64 'Krypton' (28 March 2021)
## About Inform 7

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 27 March 2021
Build Number: 6R63
Build Date: 28 March 2021
Build Number: 6R64

View file

@ -159,14 +159,14 @@ container (called the sack) is capacious if...".
</li></ul>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">AdjectivalDefinitionFamily::given_body</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">AdjectivalDefinitionFamily::given_body</span></span>:<br/><a href="5-adf.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </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">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </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">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Phrases::TypeData::set_mor</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">DECIDES_CONDITION_MOR</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::TypeData::set_mor</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">DECIDES_CONDITION_MOR</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">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="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">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

@ -21,6 +21,7 @@ function togglePopup(material_id) {
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Preform-Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
@ -72,7 +73,9 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">assertions</a></li><li><a href="index.html#5">Chapter 5: Imperative Code</a></li><li><b>Imperative Definitions</b></li></ul></div>
<p class="purpose">Each IMPERATIVE node in the syntax tree makes a definition using imperative code.</p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>Inform has several features &mdash; most obviously rules and "To ..." phrases &mdash;
<ul class="toc"><li><a href="5-id.html#SP1">&#167;1. The head</a></li><li><a href="5-id.html#SP7">&#167;7. The body</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. The head. </b>Inform has several features &mdash; most obviously rules and "To ..." phrases &mdash;
where something is created with top-level syntax with a shape like so:
</p>
@ -102,7 +105,7 @@ definition makes a "To..." phrase if its family is the one looked after by
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">family</span><span class="plain-syntax">; </span><span class="comment-syntax"> what manner of thing is defined</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">general_pointer</span><span class="plain-syntax"> </span><span class="identifier-syntax">family_specific_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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">at</span><span class="plain-syntax">; </span><span class="comment-syntax"> where this occurs in the syntax tree</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body_of_defn</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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body_of_defn</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">log_text</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">imperative_defn</span><span class="plain-syntax">;</span>
@ -185,10 +188,10 @@ detailed look possible.
<span class="plain-syntax"> </span><span class="string-syntax">"there doesn't seem to be any definition here"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"so I can't see what this rule or phrase would do."</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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::create_from_preamble</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">-&gt;</span><span class="element-syntax">body_of_defn</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">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">body_of_defn</span><span class="plain-syntax"> = </span><a href="5-id.html#SP8" class="function-link"><span class="function-syntax">ImperativeDefinitions::new_body</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-id.html#SP10" class="function-link"><span class="function-syntax">ImperativeDefinitions::detect_inline</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-idf.html#SP5" class="function-link"><span class="function-syntax">ImperativeDefinitionFamilies::given_body</span></a><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">Phrases::prepare_stack_frame</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">Phrases::prepare_stack_frame</span><span class="plain-syntax">(</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">);</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">initial_problem_count</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">problem_count</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
@ -211,7 +214,7 @@ detailed look possible.
<pre class="displayed-code all-displayed-code code-font">
<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">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="reserved-syntax">imperative_defn</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </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="identifier-syntax">runtime_context_data</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </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">runtime_context_data</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="5-idf.html#SP7" class="function-link"><span class="function-syntax">ImperativeDefinitionFamilies::to_phrcd</span></a><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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">initial_problem_count</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">problem_count</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
@ -228,8 +231,7 @@ detailed look possible.
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-id.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>Whatever is defined probably wants to compile the body of the definition
into at least one (and perhaps more than one) Inter function. This is handled
in two stages. Stage one:
into at least one (and perhaps more than one) Inter function:
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -253,25 +255,120 @@ in two stages. Stage one:
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_compiled</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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at_least_one_compiled_form_needed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">at_least_one_compiled_form_needed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_to_compile</span><span class="plain-syntax">++;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-id.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>Stage two happens at least later, and may be repeated, so that it is
important not to do anything twice. This is intended as a final round-up of
any run-time resources which need to be made by the family.
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. The body. </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">phrase</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">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="identifier-syntax">ph_type_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">type_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">ph_options_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">options_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">ph_runtime_context_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">runtime_context_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">ph_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>
<span class="plain-syntax">} </span><span class="reserved-syntax">phrase</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure phrase is accessed in 5/idf, 5/adf, 5/tpf, 5/rf, 6/eqt and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>The life of a <span class="extract"><span class="extract-syntax">phrase</span></span> structure begins when we look at the parse-tree
representation of its declaration in the source text.
</p>
<p class="commentary">A phrase is inline if and only if its definition consists of a single
invocation which is given as verbatim I6.
</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">ImperativeDefinitions::compile_as_needed</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">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idf</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">idf</span><span class="plain-syntax">, </span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="5-idf.html#SP13" class="function-link"><span class="function-syntax">ImperativeDefinitionFamilies::compile_as_needed</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idf</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> &amp;</span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">total_phrases_to_compile</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ImperativeDefinitions::new_body</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">ImperativeDefinitions::new_body</span></span>:<br/><a href="5-id.html#SP5_1">&#167;5.1</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</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="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">p</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) != </span><span class="identifier-syntax">IMPERATIVE_NT</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">"a phrase preamble should be at a IMPERATIVE_NT node"</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">PHRASE_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Creating phrase: &lt;%W&gt;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">log_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</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">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::Options::new</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">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::Context::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </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">Phrases::TypeData::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </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">Phrases::new_compilation_data</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="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">body</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>Inline definitions open with a raw Inform 6 inclusion. The lexer processes
those as two words: first <span class="extract"><span class="extract-syntax">(-</span></span>, which serves as a marker, and then the raw
text of the inclusion treated as a single "word".
</p>
<p class="commentary">Some inline definitions also mark themselves to be included only in To phrases
of the right sort: it makes no sense to respond "yes" to a phrase "To decide
what number is...", for instance.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;inline-phrase-definition&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">(-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">###</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">in</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">only</span><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"> { DECIDES_NOTHING_MOR, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">(-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">###</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">in</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">decide</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">if</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">only</span><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"> { DECIDES_CONDITION_MOR, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">(-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">###</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">in</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">decide</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">only</span><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"> { DECIDES_VALUE_MOR, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">(-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">###</span><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"> { DONT_KNOW_MOR, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">(-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">###</span><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="5-id.html#SP9_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_TailAfterInline problem</span><span class="named-paragraph-number">9.1</span></a></span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_1" class="paragraph-anchor"></a><b>&#167;9.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_TailAfterInline problem</span><span class="named-paragraph-number">9.1</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<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_TailAfterInline</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"some unexpected text appears after the tail of an inline definition"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"placed within '(-' and '-)' markers to indicate that it is written in "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Inform 6. Here, there seems to be something extra after the '-)'."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { </span><span class="identifier-syntax">fail</span><span class="plain-syntax"> </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> };</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-id.html#SP9">&#167;9</a>.</li></ul>
<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">void</span><span class="plain-syntax"> </span><span class="function-syntax">ImperativeDefinitions::detect_inline</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">ImperativeDefinitions::detect_inline</span></span>:<br/><a href="5-id.html#SP5_1">&#167;5.1</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">inline_wn</span><span class="plain-syntax"> = -1, </span><span class="identifier-syntax">mor</span><span class="plain-syntax"> = </span><span class="identifier-syntax">DONT_KNOW_MOR</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">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="function-syntax">&lt;inline-phrase-definition&gt;(Node::get_text(p-&gt;down-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">)))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inline_wn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;inline-phrase-definition&gt;</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">mor</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;r&gt;&gt;</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">inline_wn</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wide::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">Lexer::word_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">inline_wn</span><span class="plain-syntax">)) &gt;= </span><span class="identifier-syntax">MAX_INLINE_DEFN_LENGTH</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-id.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Forbid overly long inline definitions</span><span class="named-paragraph-number">10.1</span></a></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-idf.html#SP11" class="function-link"><span class="function-syntax">ImperativeDefinitionFamilies::allows_inline</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">id</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="5-id.html#SP10_2" class="named-paragraph-link"><span class="named-paragraph">Inline is for To... phrases only</span><span class="named-paragraph-number">10.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </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">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Phrases::TypeData::make_inline</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Phrases::make_inline</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">inline_wn</span><span class="plain-syntax">, </span><span class="identifier-syntax">mor</span><span class="plain-syntax">);</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">Forbid overly long inline definitions</span><span class="named-paragraph-number">10.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">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_InlineTooLong</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the inline definition of this 'to...' phrase is too long"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"using a quantity of Inform 6 code which exceeds the fairly small limit "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"allowed. You will need either to write the phrase definition in Inform 7, "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"or to call an I6 routine which you define elsewhere with an 'Include ...'."</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-id.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10_2" class="paragraph-anchor"></a><b>&#167;10.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline is for To... phrases only</span><span class="named-paragraph-number">10.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">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_InlineRule</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"only 'to...' phrases can be given inline Inform 6 definitions"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"and in particular rules and adjective definitions can't."</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-id.html#SP10">&#167;10</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-imp.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresscurrent">id</li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-idf.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -190,7 +190,7 @@ family to give the body its runtime context data.
<span class="identifier-syntax">ph_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="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">stack_frame</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_runtime_context_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::Context::new</span><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>
@ -255,7 +255,7 @@ be given as <span class="extract"><span class="extract-syntax">(-</span></span>
<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">ALLOWS_INLINE_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">f</span><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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ImperativeDefinitionFamilies::allows_inline</span><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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ImperativeDefinitionFamilies::allows_inline</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">ImperativeDefinitionFamilies::allows_inline</span></span>:<br/>Imperative Definitions - <a href="5-id.html#SP10">&#167;10</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="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>
<span class="plain-syntax"> </span><span class="identifier-syntax">INT_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">rv</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">ALLOWS_INLINE_IMP_DEFN_MTID</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax">;</span>
@ -272,30 +272,13 @@ it may want to turn its definition bodies into Inter functions.
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">COMPILE_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">imperative_defn_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">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_to_compile</span><span class="plain-syntax">)</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ImperativeDefinitionFamilies::compile</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">ImperativeDefinitionFamilies::compile</span></span>:<br/>Imperative Definitions - <a href="5-id.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">f</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ImperativeDefinitionFamilies::compile</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">ImperativeDefinitionFamilies::compile</span></span>:<br/>Imperative Definitions - <a href="5-id.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_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">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_to_compile</span><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">f</span><span class="plain-syntax">, </span><span class="constant-syntax">COMPILE_IMP_DEFN_MTID</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">total_phrases_to_compile</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><span class="extract"><span class="extract-syntax">COMPILE_AS_NEEDED_IMP_DEFN_MTID</span></span> is then called as an opportunity to
compile any remaining resources, and should pick up anything needed since the
last time it was called: note that it can be called multiple times.
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">COMPILE_AS_NEEDED_IMP_DEFN_MTID</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">COMPILE_AS_NEEDED_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">imperative_defn_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">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_to_compile</span><span class="plain-syntax">)</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ImperativeDefinitionFamilies::compile_as_needed</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">ImperativeDefinitionFamilies::compile_as_needed</span></span>:<br/>Imperative Definitions - <a href="5-id.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_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">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_to_compile</span><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">f</span><span class="plain-syntax">, </span><span class="constant-syntax">COMPILE_AS_NEEDED_IMP_DEFN_MTID</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">total_phrases_to_compile</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><span class="extract"><span class="extract-syntax">PHRASEBOOK_INDEX_IMP_DEFN_MTID</span></span> should reply <span class="extract"><span class="extract-syntax">TRUE</span></span> if the definition should
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. </b><span class="extract"><span class="extract-syntax">PHRASEBOOK_INDEX_IMP_DEFN_MTID</span></span> should reply <span class="extract"><span class="extract-syntax">TRUE</span></span> if the definition should
go into the Phrasebook page of the index.
</p>

View file

@ -476,8 +476,8 @@ connect this existing one to the phrase.
<span class="plain-syntax"> </span><span class="identifier-syntax">rfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defines</span><span class="plain-syntax"> = </span><span class="identifier-syntax">R</span><span class="plain-syntax">;</span>
<span class="comment-syntax"> if (rfd-&gt;not_in_rulebook == FALSE) Rules::request_automatic_placement(R);</span>
<span class="plain-syntax"> </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="identifier-syntax">compile_with_run_time_debugging</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">Phrases::TypeData::set_mor</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="identifier-syntax">type_data</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </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">compile_with_run_time_debugging</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">Phrases::TypeData::set_mor</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">type_data</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DECIDES_NOTHING_AND_RETURNS_MOR</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -73,7 +73,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">assertions</a></li><li><a href="index.html#5">Chapter 5: Imperative Code</a></li><li><b>To Phrase Family</b></li></ul></div>
<p class="purpose">Imperative definitions of "To..." phrases.</p>
<ul class="toc"><li><a href="5-tpf.html#SP1">&#167;1. Introduction</a></li><li><a href="5-tpf.html#SP3">&#167;3. Identification</a></li><li><a href="5-tpf.html#SP5">&#167;5. Assessment</a></li><li><a href="5-tpf.html#SP10">&#167;10. Compilation</a></li><li><a href="5-tpf.html#SP17">&#167;17. To begin</a></li><li><a href="5-tpf.html#SP18">&#167;18. Phrase option parsing</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="5-tpf.html#SP1">&#167;1. Introduction</a></li><li><a href="5-tpf.html#SP3">&#167;3. Identification</a></li><li><a href="5-tpf.html#SP5">&#167;5. Assessment</a></li><li><a href="5-tpf.html#SP10">&#167;10. Compilation</a></li><li><a href="5-tpf.html#SP11">&#167;11. Access functions</a></li><li><a href="5-tpf.html#SP17">&#167;17. To begin</a></li><li><a href="5-tpf.html#SP18">&#167;18. Phrase option parsing</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Introduction. </b>This family handles definitions of "To..." phrases: Inform's equivalent of
function definitions. For example:
@ -96,18 +96,22 @@ by its opening word "To".
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_phrase_idf</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSESS_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><a href="5-tpf.html#SP6" class="function-link"><span class="function-syntax">ToPhraseFamily::assess</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_phrase_idf</span><span class="plain-syntax">, </span><span class="constant-syntax">REGISTER_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><a href="5-tpf.html#SP9" class="function-link"><span class="function-syntax">ToPhraseFamily::register</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_phrase_idf</span><span class="plain-syntax">, </span><span class="constant-syntax">GIVEN_BODY_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><a href="5-tpf.html#SP7" class="function-link"><span class="function-syntax">ToPhraseFamily::given_body</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_phrase_idf</span><span class="plain-syntax">, </span><span class="constant-syntax">ALLOWS_INLINE_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><a href="5-tpf.html#SP9" class="function-link"><span class="function-syntax">ToPhraseFamily::allows_inline</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_phrase_idf</span><span class="plain-syntax">, </span><span class="constant-syntax">ALLOWS_INLINE_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><a href="5-tpf.html#SP11" class="function-link"><span class="function-syntax">ToPhraseFamily::allows_inline</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_phrase_idf</span><span class="plain-syntax">, </span><span class="constant-syntax">COMPILE_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><a href="5-tpf.html#SP10" class="function-link"><span class="function-syntax">ToPhraseFamily::compile</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_phrase_idf</span><span class="plain-syntax">, </span><span class="constant-syntax">COMPILE_AS_NEEDED_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><a href="5-tpf.html#SP11" class="function-link"><span class="function-syntax">ToPhraseFamily::compile_as_needed</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_phrase_idf</span><span class="plain-syntax">, </span><span class="constant-syntax">PHRASEBOOK_INDEX_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><a href="5-tpf.html#SP9" class="function-link"><span class="function-syntax">ToPhraseFamily::include_in_Phrasebook_index</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_phrase_idf</span><span class="plain-syntax">, </span><span class="constant-syntax">PHRASEBOOK_INDEX_IMP_DEFN_MTID</span><span class="plain-syntax">, </span><a href="5-tpf.html#SP11" class="function-link"><span class="function-syntax">ToPhraseFamily::include_in_Phrasebook_index</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Each To... phrase is given one of these:
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Each To... preamble is parsed and given a <a href="5-tpf.html#SP2" class="internal">to_family_data</a> object. The
following slightly contrived example shows the resulting wordings; in practice
only the prototype is compulsory, and the other two are often empty.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">To</span><span class="plain-syntax"> </span><span class="identifier-syntax">double</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> - </span><span class="identifier-syntax">a</span><span class="plain-syntax"> </span><span class="identifier-syntax">number</span><span class="plain-syntax">) (</span><span class="identifier-syntax">documented</span><span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax"> </span><span class="identifier-syntax">PHDOUBLE</span><span class="plain-syntax"> ) (</span><span class="identifier-syntax">this</span><span class="plain-syntax"> </span><span class="identifier-syntax">is</span><span class="plain-syntax"> </span><span class="identifier-syntax">doubling</span><span class="plain-syntax"> ):</span>
<span class="plain-syntax">&lt;---- </span><span class="identifier-syntax">prototype</span><span class="plain-syntax"> -------&gt; &lt;- </span><span class="identifier-syntax">doc</span><span class="plain-syntax"> -&gt; &lt;- </span><span class="identifier-syntax">const</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax"> -&gt;</span>
</pre>
<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">to_family_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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">pattern</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">prototype_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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">constant_name</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">ph_documentation_symbol</span><span class="plain-syntax">; </span><span class="comment-syntax"> the documentation reference, if any</span>
@ -122,7 +126,6 @@ by its opening word "To".
<span class="reserved-syntax">to_family_data</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::new_data</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">ToPhraseFamily::new_data</span></span>:<br/><a href="5-tpf.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">to_family_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">to_family_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">pattern</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">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">prototype_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">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constant_name</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">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ph_documentation_symbol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
@ -252,51 +255,46 @@ right:
<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">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constant_name</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">constant_phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cphr</span><span class="plain-syntax"> = </span><a href="5-tpf.html#SP14" class="function-link"><span class="function-syntax">ToPhraseFamily::parse_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NW</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">cphr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cphr_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="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><a href="5-tpf.html#SP16" class="function-link"><span class="function-syntax">ToPhraseFamily::body_of_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cphr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><a href="5-tpf.html#SP16" class="function-link"><span class="function-syntax">ToPhraseFamily::body_of_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cphr</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">ph</span><span class="plain-syntax">) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::declaration_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Diagrams::new_UNPARSED_NOUN</span><span class="plain-syntax">(</span><span class="identifier-syntax">Nouns::nominative_singular</span><span class="plain-syntax">(</span><span class="identifier-syntax">cphr</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">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">Nouns::nominative_singular</span><span class="plain-syntax">(</span><span class="identifier-syntax">cphr</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">StandardProblems::handmade_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_NamedGeneric</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"I can't allow %1, because the phrase it gives a name to "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"is generic, that is, it has a kind which is too vague. "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"That means there isn't any single phrase which '%2' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"could refer to - there would have to be different versions "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"for every setting where it might be needed, and we can't "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"predict in advance which one '%2' might need to be."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="string-syntax">"I can't allow %1, because the phrase it gives a name to is generic, that is, "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"it has a kind which is too vague. That means there isn't any single phrase "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which '%2' could refer to - there would have to be different versions "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"for every setting where it might be needed, and we can't predict in advance "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which one '%2' might need to be."</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>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_constant</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cphr</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-tpf.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 takes a phrase and makes it officially a To
phrase, which in particular means adding it to the list of To phrases in
logical order. This essentially means that two lexically
indistinguishable phrases (e.g., "admire (OC - an open container)" and
"admire (C - a container)") are placed such that the more specific, in
type-checking terms, comes first (the open container case being the more
specific). The purpose of this list is to ensure that excerpt meanings
for phrase definitions are registered in logical priority order, because
the excerpt parser prefers earlier registrations to later ones in case
of ambiguity.
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>The following routine takes a phrase and makes it officially a To phrase,
which in particular means adding it to the list of To phrases in logical
order. This essentially means that two lexically indistinguishable phrases
(e.g., "admire (OC - an open container)" and "admire (C - a container)") are
placed such that the more specific, in type-checking terms, comes first (the
open container case being the more specific).
</p>
<p class="commentary">Note that the following sort algorithm affects only "to..." phrases,
and therefore has no effect on rule ordering within rulebooks.
<p class="commentary">This code affects only "To..." phrases, so it has no effect on rule ordering
within rulebooks. That's a similar issue, but addressed differently elsewhere.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_in_logical_order</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::given_body</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">ToPhraseFamily::given_body</span></span>:<br/><a href="5-tpf.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </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">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </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">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Routines::prepare_for_requests</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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">XW</span><span class="plain-syntax"> = </span><a href="5-tpf.html#SP9" class="function-link"><span class="function-syntax">ToPhraseFamily::get_prototype_text</span></a><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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">XW</span><span class="plain-syntax"> = </span><a href="5-tpf.html#SP11" class="function-link"><span class="function-syntax">ToPhraseFamily::get_prototype_text</span></a><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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">OW</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">Phrases::TypeData::Textual::parse</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="identifier-syntax">type_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">XW</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">OW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Phrases::Options::parse_declared_options</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="identifier-syntax">options_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">OW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Phrases::TypeData::Textual::parse</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">type_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">XW</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">OW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Phrases::Options::parse_declared_options</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">options_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">OW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">previous_id</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">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_id</span><span class="plain-syntax"> = </span><span class="identifier-syntax">first_in_logical_order</span><span class="plain-syntax">;</span>
@ -344,8 +342,8 @@ either is:
<span class="definition-keyword">define</span> <span class="constant-syntax">CONFLICTED_PH</span><span class="plain-syntax"> </span><span class="constant-syntax">4</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">ToPhraseFamily::cmp</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">ToPhraseFamily::cmp</span></span>:<br/><a href="5-tpf.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph1</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph2</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">r</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::TypeData::comparison</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph1</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph2</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">));</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::cmp</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">ToPhraseFamily::cmp</span></span>:<br/><a href="5-tpf.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph1</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph2</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">r</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::TypeData::comparison</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph1</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</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">Log::aspect_switched_on</span><span class="plain-syntax">(</span><span class="identifier-syntax">PHRASE_COMPARISONS_DA</span><span class="plain-syntax">)) || (</span><span class="identifier-syntax">r</span><span class="plain-syntax"> == </span><span class="constant-syntax">CONFLICTED_PH</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">"Phrase comparison ("</span><span class="plain-syntax">);</span>
@ -368,10 +366,11 @@ either is:
<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="constant-syntax">CONFLICTED_PH</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">Phrases::declaration_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph1</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">Phrases::declaration_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph2</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_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_ConflictedReturnKinds</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_ConflictedReturnKinds</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The two phrase definitions %1 and %2 make the same wording "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"produce two different kinds of value, which is not allowed."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The two phrase definitions %1 and %2 make the same wording produce two "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"different kinds of value, which is not allowed."</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>
<span class="plain-syntax"> }</span>
@ -393,16 +392,103 @@ number them sequentially from 0:
<span class="plain-syntax"> </span><span class="identifier-syntax">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sequence_count</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>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Compilation. </b>We actually don't compile anything here: we just make "requests" to do so.
</p>
<span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::meaning_as_phrase</span><span class="plain-syntax">(</span><span class="identifier-syntax">excerpt_meaning</span><span class="plain-syntax"> *</span><span class="identifier-syntax">em</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">ToPhraseFamily::compile</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">ToPhraseFamily::compile</span></span>:<br/><a href="5-tpf.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</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">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_to_compile</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-tpf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Mark To... phrases which have definite kinds for future compilation</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-tpf.html#SP10_2" class="named-paragraph-link"><span class="named-paragraph">Throw problems for phrases with return kinds too vaguely defined</span><span class="named-paragraph-number">10.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-tpf.html#SP10_3" class="named-paragraph-link"><span class="named-paragraph">Throw problems for inline phrases named as constants</span><span class="named-paragraph-number">10.3</span></a></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">Mark To... phrases which have definite kinds for future compilation</span><span class="named-paragraph-number">10.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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</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">Phrases::TypeData::kind</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">at_least_one_compiled_form_needed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PhraseRequests::make_request</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</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">EMPTY_WORDING</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-tpf.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10_2" class="paragraph-anchor"></a><b>&#167;10.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Throw problems for phrases with return kinds too vaguely defined</span><span class="named-paragraph-number">10.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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</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">KR</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::TypeData::get_return_kind</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</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::semidefinite</span><span class="plain-syntax">(</span><span class="identifier-syntax">KR</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">Phrases::TypeData::arithmetic_operation</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) == -1)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::declaration_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_ReturnKindVague</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The declaration %1 tries to set up a phrase which decides a value which is "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"too vaguely described. For example, 'To decide which number is the target: "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"...' is fine, because 'number' is clear about what kind of value should "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"emerge; but 'To decide which value is the target: ...' is not clear enough."</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>
<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">=1; </span><span class="identifier-syntax">k</span><span class="plain-syntax">&lt;=26; </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::involves_var</span><span class="plain-syntax">(</span><span class="identifier-syntax">KR</span><span class="plain-syntax">, </span><span class="identifier-syntax">k</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Phrases::TypeData::tokens_contain_variable</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</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">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::declaration_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</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">var_letter</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">var_letter</span><span class="plain-syntax">, </span><span class="character-syntax">'A'</span><span class="plain-syntax">+</span><span class="identifier-syntax">k</span><span class="plain-syntax">-1);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">var_letter</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_ReturnKindUndetermined</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The declaration %1 tries to set up a phrase which decides a value which "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"is too vaguely described, because it involves a kind variable (%2) which "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"it can't determine through usage."</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>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_letter</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="5-tpf.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10_3" class="paragraph-anchor"></a><b>&#167;10.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Throw problems for inline phrases named as constants</span><span class="named-paragraph-number">10.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="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</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">Phrases::TypeData::invoked_inline</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="5-tpf.html#SP11" class="function-link"><span class="function-syntax">ToPhraseFamily::has_name_as_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</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">Phrases::declaration_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_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_NamedInline</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The declaration %1 tries to give a name to a phrase which is defined using "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"inline Inform 6 code in (- markers -). Such phrases can't be named and used "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"as constants because they have no independent existence, being instead made "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"fresh each time they are used."</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>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-tpf.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Access functions. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::meaning_as_phrase</span><span class="plain-syntax">(</span><span class="identifier-syntax">excerpt_meaning</span><span class="plain-syntax"> *</span><span class="identifier-syntax">em</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">em</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">RETRIEVE_POINTER_phrase</span><span class="plain-syntax">(</span><span class="identifier-syntax">em</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</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">ToPhraseFamily::sequence_count</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::sequence_count</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</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="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family</span><span class="plain-syntax"> != </span><span class="identifier-syntax">to_phrase_idf</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"sequence count on what is not a To"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">to_family_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_to_family_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_specific_data</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family</span><span class="plain-syntax"> != </span><span class="identifier-syntax">to_phrase_idf</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"sequence count on what is not a To"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">to_family_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_to_family_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_specific_data</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">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sequence_count</span><span class="plain-syntax"> == -1) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Phrases::log</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</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">"Sequence count not ready"</span><span class="plain-syntax">);</span>
@ -410,21 +496,21 @@ number them sequentially from 0:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sequence_count</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">ToPhraseFamily::allows_inline</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">ToPhraseFamily::allows_inline</span></span>:<br/><a href="5-tpf.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::allows_inline</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">ToPhraseFamily::allows_inline</span></span>:<br/><a href="5-tpf.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><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="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">int</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::include_in_Phrasebook_index</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">ToPhraseFamily::include_in_Phrasebook_index</span></span>:<br/><a href="5-tpf.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::include_in_Phrasebook_index</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">ToPhraseFamily::include_in_Phrasebook_index</span></span>:<br/><a href="5-tpf.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><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="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="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::inverse</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">ToPhraseFamily::inverse</span></span>:<br/>Equations - <a href="6-eqt.html#SP41_3_2">&#167;41.3.2</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="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::inverse</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">ToPhraseFamily::inverse</span></span>:<br/>Equations - <a href="6-eqt.html#SP41_3_2">&#167;41.3.2</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="reserved-syntax">if</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="identifier-syntax">to_phrase_idf</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">to_family_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_to_family_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_specific_data</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">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">explicit_name_for_inverse</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</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><a href="5-tpf.html#SP9" class="function-link"><span class="function-syntax">ToPhraseFamily::get_equation_form</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</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><a href="5-tpf.html#SP11" class="function-link"><span class="function-syntax">ToPhraseFamily::get_equation_form</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-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">Wordings::nonempty</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::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">explicit_name_for_inverse</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">ph</span><span class="plain-syntax">;</span>
@ -433,13 +519,13 @@ number them sequentially from 0:
<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">constant_phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::constant_phrase</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">ToPhraseFamily::constant_phrase</span></span>:<br/><a href="5-tpf.html#SP16">&#167;16</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="reserved-syntax">constant_phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::constant_phrase</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">ToPhraseFamily::constant_phrase</span></span>:<br/><a href="5-tpf.html#SP16">&#167;16</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="reserved-syntax">if</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="identifier-syntax">to_phrase_idf</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">to_family_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_to_family_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_specific_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">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_constant</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::get_prototype_text</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">ToPhraseFamily::get_prototype_text</span></span>:<br/><a href="5-tpf.html#SP7">&#167;7</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="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::get_prototype_text</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">ToPhraseFamily::get_prototype_text</span></span>:<br/><a href="5-tpf.html#SP7">&#167;7</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="reserved-syntax">if</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="identifier-syntax">to_phrase_idf</span><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><span class="reserved-syntax">to_family_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_to_family_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_specific_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">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">prototype_text</span><span class="plain-syntax">;</span>
@ -451,7 +537,7 @@ number them sequentially from 0:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constant_name</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">ToPhraseFamily::has_name_as_constant</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">ToPhraseFamily::has_name_as_constant</span></span>:<br/><a href="5-tpf.html#SP10_3">&#167;10.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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::has_name_as_constant</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">ToPhraseFamily::has_name_as_constant</span></span>:<br/><a href="5-tpf.html#SP10_3">&#167;10.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="reserved-syntax">if</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="identifier-syntax">to_phrase_idf</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">to_family_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_to_family_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_specific_data</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">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_constant</span><span class="plain-syntax">) &amp;&amp;</span>
@ -460,7 +546,7 @@ number them sequentially from 0:
<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="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::get_equation_form</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">ToPhraseFamily::get_equation_form</span></span>:<br/>Equations - <a href="6-eqt.html#SP19">&#167;19</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="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::get_equation_form</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">ToPhraseFamily::get_equation_form</span></span>:<br/>Equations - <a href="6-eqt.html#SP19">&#167;19</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="reserved-syntax">if</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="identifier-syntax">to_phrase_idf</span><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><span class="reserved-syntax">to_family_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_to_family_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_specific_data</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">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">explicit_name_used_in_maths</span><span class="plain-syntax">)</span>
@ -474,165 +560,6 @@ number them sequentially from 0:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">tfd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ph_documentation_symbol</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. Compilation. </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">ToPhraseFamily::compile</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">ToPhraseFamily::compile</span></span>:<br/><a href="5-tpf.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</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">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_to_compile</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-tpf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Mark To... phrases which have definite kinds for future compilation</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-tpf.html#SP10_2" class="named-paragraph-link"><span class="named-paragraph">Throw problems for phrases with return kinds too vaguely defined</span><span class="named-paragraph-number">10.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-tpf.html#SP10_3" class="named-paragraph-link"><span class="named-paragraph">Throw problems for inline phrases named as constants</span><span class="named-paragraph-number">10.3</span></a></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>As we'll see, it's legal in Inform to define "To..." phrases with vague
kinds: "To expose (X - a value)", for example. This can't be compiled as
vaguely as the definition implies, since there would be no way to know how
to store X. Instead, for each different kind of X which is actually needed,
a fresh version of the phrase is compiled &mdash; one where X is a number, one
where it's a text, and so on. This is handled by making a "request" for the
phrase, indicating that a compiled version of it will be needed.
</p>
<p class="commentary">Since "To..." phrases are only compiled on request, we must remember to
request the boring ones with straightforward kinds ("To award (N - a number)
points", say). This is where we do it:
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Mark To... phrases which have definite kinds for future compilation</span><span class="named-paragraph-number">10.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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</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">Phrases::TypeData::kind</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</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="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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at_least_one_compiled_form_needed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PhraseRequests::make_request</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</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">EMPTY_WORDING</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="5-tpf.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10_2" class="paragraph-anchor"></a><b>&#167;10.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Throw problems for phrases with return kinds too vaguely defined</span><span class="named-paragraph-number">10.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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</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">KR</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::TypeData::get_return_kind</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</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="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Kinds::Behaviour::semidefinite</span><span class="plain-syntax">(</span><span class="identifier-syntax">KR</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">Phrases::TypeData::arithmetic_operation</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) == -1)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::declaration_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_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_ReturnKindVague</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The declaration %1 tries to set up a phrase which decides a "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"value which is too vaguely described. For example, 'To decide "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which number is the target: ...' is fine, because 'number' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"is clear about what kind of value should emerge; but 'To "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"decide which value is the target: ...' is not clear enough."</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>
<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">=1; </span><span class="identifier-syntax">k</span><span class="plain-syntax">&lt;=26; </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::involves_var</span><span class="plain-syntax">(</span><span class="identifier-syntax">KR</span><span class="plain-syntax">, </span><span class="identifier-syntax">k</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Phrases::TypeData::tokens_contain_variable</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</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">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::declaration_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</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">var_letter</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">var_letter</span><span class="plain-syntax">, </span><span class="character-syntax">'A'</span><span class="plain-syntax">+</span><span class="identifier-syntax">k</span><span class="plain-syntax">-1);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">var_letter</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_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_ReturnKindUndetermined</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The declaration %1 tries to set up a phrase which decides a "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"value which is too vaguely described, because it involves "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a kind variable (%2) which it can't determine through "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"usage."</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>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_letter</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="5-tpf.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10_3" class="paragraph-anchor"></a><b>&#167;10.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Throw problems for inline phrases named as constants</span><span class="named-paragraph-number">10.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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</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">Phrases::TypeData::invoked_inline</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="5-tpf.html#SP9" class="function-link"><span class="function-syntax">ToPhraseFamily::has_name_as_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</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">Phrases::declaration_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_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_NamedInline</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The declaration %1 tries to give a name to a phrase which is "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"defined using inline Inform 6 code in (- markers -). Such "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"phrases can't be named and used as constants because they "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"have no independent existence, being instead made fresh "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"each time they are used."</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>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-tpf.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>The twilight gathers, but our work is far from done. Recall that we have
accumulated compilation requests for "To..." phrases, but haven't actually
acted on them yet.
</p>
<p class="commentary">We have to do this in quite an open-ended way, because compiling one phrase
can easily generate fresh requests for others. For instance, suppose we have
the definition "To expose (X - a value)" in play, and suppose that when
compiling the phrase "To advertise", Inform runs into the line "expose the
hoarding text". This causes it to issue a compilation request for "To expose
(X - a text)". Perhaps we've compiled such a form already, but perhaps we
haven't. Compilation therefore goes on until all requests have been dealt
with.
</p>
<p class="commentary">Compiling phrases also produces the need for other pieces of code to be
generated &mdash; for example, suppose our phrase being compiled, "To advertise",
includes the text:
</p>
<blockquote>
<p>let Z be "Two for the price of one! Just [expose price]!";</p>
</blockquote>
<p class="commentary">We are going to need to compile "Two for the price of one! Just [expose price]!"
later on, in its own text substitution routine; but notice that it contains
the need for "To expose (X - a number)", and that will generate a further
phrase request.
</p>
<p class="commentary">Because of this and similar problems, it's impossible to compile all the
phrases alone: we must compile phrases, then things arising from them, then
phrases arising from those, then things arising from the phrases arising
from those, and so on, until we're done. The process is therefore structured
as a set of "coroutines" which each carry out as much as they can and then
hand over to the others to generate more work.
</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">ToPhraseFamily::compile_as_needed</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">ToPhraseFamily::compile_as_needed</span></span>:<br/><a href="5-tpf.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">imperative_defn_family</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</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">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_to_compile</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">repeat</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">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">repeat</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">repeat</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">PhraseRequests::compilation_coroutine</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">total_phrases_to_compile</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">repeat</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">ListTogether::compilation_coroutine</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">repeat</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LoopingOverScope::compilation_coroutine</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">repeat</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">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Strings::TextSubstitutions::compilation_coroutine</span><span class="plain-syntax">(</span><span class="identifier-syntax">FALSE</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">repeat</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">Propositions::Deferred::compilation_coroutine</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">repeat</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>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b>A few "To..." phrases have names, and can therefore be used as values in their
own right, a functional-programming sort of device. For example:
</p>
@ -647,7 +574,7 @@ own right, a functional-programming sort of device. For example:
<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">constant_phrase</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">noun</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">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrase_meant</span><span class="plain-syntax">; </span><span class="comment-syntax"> if known at this point</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrase_meant</span><span class="plain-syntax">; </span><span class="comment-syntax"> if known at this point</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">cphr_kind</span><span class="plain-syntax">; </span><span class="comment-syntax"> ditto</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">cphr_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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">associated_preamble_text</span><span class="plain-syntax">;</span>
@ -659,7 +586,7 @@ own right, a functional-programming sort of device. For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">constant_phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::create_constant</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">ToPhraseFamily::create_constant</span></span>:<br/><a href="5-tpf.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">NW</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">RW</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">constant_phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::create_constant</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">ToPhraseFamily::create_constant</span></span>:<br/><a href="5-tpf.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">NW</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">RW</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">constant_phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cphr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">constant_phrase</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">cphr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">phrase_meant</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> we won't know until later</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">cphr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">cphr_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> nor this</span>
@ -674,7 +601,7 @@ own right, a functional-programming sort of device. For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">constant_phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::parse_constant</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">ToPhraseFamily::parse_constant</span></span>:<br/><a href="5-tpf.html#SP4">&#167;4</a>, <a href="5-tpf.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">NW</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">constant_phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::parse_constant</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">ToPhraseFamily::parse_constant</span></span>:<br/><a href="5-tpf.html#SP4">&#167;4</a>, <a href="5-tpf.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">NW</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-value&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">NW</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="function-syntax">&lt;&lt;rp&gt;&gt;</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">Rvalues::is_CONSTANT_construction</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">CON_phrase</span><span class="plain-syntax">)) {</span>
@ -693,7 +620,7 @@ the following takes a patch-it-later approach.
</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">ToPhraseFamily::kind</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">ToPhraseFamily::kind</span></span>:<br/><a href="5-tpf.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">constant_phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cphr</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::kind</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">ToPhraseFamily::kind</span></span>:<br/><a href="5-tpf.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">constant_phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cphr</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">cphr</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">global_pass_state</span><span class="plain-syntax">.</span><span class="element-syntax">pass</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">2</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_con</span><span class="plain-syntax">(</span><span class="identifier-syntax">CON_phrase</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">cphr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cphr_kind</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
@ -710,12 +637,12 @@ the following takes a patch-it-later approach.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::body_of_constant</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">ToPhraseFamily::body_of_constant</span></span>:<br/><a href="5-tpf.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">constant_phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cphr</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">ToPhraseFamily::body_of_constant</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">ToPhraseFamily::body_of_constant</span></span>:<br/><a href="5-tpf.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">constant_phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cphr</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">cphr</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">"null cphr"</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">cphr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">phrase_meant</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">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">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="reserved-syntax">imperative_defn</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-tpf.html#SP9" class="function-link"><span class="function-syntax">ToPhraseFamily::constant_phrase</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">) == </span><span class="identifier-syntax">cphr</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-tpf.html#SP11" class="function-link"><span class="function-syntax">ToPhraseFamily::constant_phrase</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">) == </span><span class="identifier-syntax">cphr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">cphr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">phrase_meant</span><span class="plain-syntax"> = </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">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -764,12 +691,12 @@ is confined to the current Chapter.
</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">ToPhraseFamily::allows_options</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">Phrases::Options::allows_options</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</span><span class="plain-syntax">));</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::allows_options</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">Phrases::Options::allows_options</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_data</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">ToPhraseFamily::parse_phrase_option_used</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">Phrases::Options::parse</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::parse_phrase_option_used</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">Phrases::Options::parse</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_data</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

@ -126,7 +126,7 @@ instance has its own <span class="extract"><span class="extract-syntax">equation
<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">equation_symbol</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">name</span><span class="plain-syntax">; </span><span class="comment-syntax"> always just one word, in fact</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">var_kind</span><span class="plain-syntax">; </span><span class="comment-syntax"> if a variable &mdash; must be quasinumerical</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">function_notated</span><span class="plain-syntax">; </span><span class="comment-syntax"> if a phrase QN to QN</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">function_notated</span><span class="plain-syntax">; </span><span class="comment-syntax"> if a phrase QN to QN</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">var_const</span><span class="plain-syntax">; </span><span class="comment-syntax"> if a symbol for a constant value</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">temp_constant</span><span class="plain-syntax">; </span><span class="comment-syntax"> is this constant a substitution for one usage only?</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">equation_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next</span><span class="plain-syntax">; </span><span class="comment-syntax"> in the list belonging to the equation</span>
@ -758,9 +758,9 @@ declarations will trump them.
<span class="plain-syntax"> </span><a href="6-eqt.html#SP20" class="function-link"><span class="function-syntax">Equations::eqn_add_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_real_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</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><a href="5-tpf.html#SP9" class="function-link"><span class="function-syntax">ToPhraseFamily::get_equation_form</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</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><a href="5-tpf.html#SP11" class="function-link"><span class="function-syntax">ToPhraseFamily::get_equation_form</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-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">Wordings::nonempty</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">equation_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ev</span><span class="plain-syntax"> = </span><a href="6-eqt.html#SP20" class="function-link"><span class="function-syntax">Equations::eqn_add_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_real_number</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="element-syntax">function_notated</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ph</span><span class="plain-syntax">;</span>
@ -1618,7 +1618,7 @@ we're unable to see what equations \(h^n\) can appear in.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">equation_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tok</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">enode_operands</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">eqn_type</span><span class="plain-syntax"> == </span><span class="constant-syntax">SYMBOL_EQN</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">leaf_symbol</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_notated</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">leaf_symbol</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_notated</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">leaf_symbol</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_notated</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">RK</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">Phrases::TypeData::arithmetic_operation</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) == </span><span class="identifier-syntax">REALROOT_OPERATION</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">OPK</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::FloatingPoint::underlying</span><span class="plain-syntax">(</span><span class="identifier-syntax">tok</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">enode_operands</span><span class="plain-syntax">[1]-&gt;</span><span class="element-syntax">gK_after</span><span class="plain-syntax">);</span>
@ -1632,7 +1632,7 @@ we're unable to see what equations \(h^n\) can appear in.
<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="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RK</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::TypeData::get_return_kind</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</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">RK</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::TypeData::get_return_kind</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tok</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gK_before</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::FloatingPoint::to_real</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::FloatingPoint::new_gk</span><span class="plain-syntax">(</span><span class="identifier-syntax">RK</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
@ -2094,8 +2094,8 @@ in this case, <span class="extract"><span class="extract-syntax">exp</span></spa
<span class="plain-syntax"> </span><a href="6-eqt.html#SP25" class="function-link"><span class="function-syntax">Equations::log_equation_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">fnode</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">"not a function being applied"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">f</span><span class="plain-syntax"> = </span><span class="identifier-syntax">fnode</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">leaf_symbol</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_notated</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">finv</span><span class="plain-syntax"> = </span><a href="5-tpf.html#SP9" class="function-link"><span class="function-syntax">ToPhraseFamily::inverse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">f</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">f</span><span class="plain-syntax"> = </span><span class="identifier-syntax">fnode</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">leaf_symbol</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_notated</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">finv</span><span class="plain-syntax"> = </span><a href="5-tpf.html#SP11" class="function-link"><span class="function-syntax">ToPhraseFamily::inverse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">f</span><span class="plain-syntax">-&gt;</span><span class="element-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">finv</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="comment-syntax"> no known inverse for this function</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">equation_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ev</span><span class="plain-syntax">, *</span><span class="identifier-syntax">ev_inverse</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>

View file

@ -332,13 +332,13 @@ so on. Those absolute basics are made here.
<span class="plain-syntax"> -1, </span><span class="identifier-syntax">debugging</span><span class="plain-syntax">, </span><span class="identifier-syntax">sequence_timer</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">Lists::check</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">ConstantLists::compile</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">Phrases::invoke_to_begin</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">ImperativeDefinitions::compile_as_needed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">PhraseRequests::invoke_to_begin</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">PhraseRequests::compile_as_needed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">Strings::compile_responses</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">Lists::check</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">ConstantLists::compile</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTRelations::compile_defined_relations</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">ImperativeDefinitions::compile_as_needed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">PhraseRequests::compile_as_needed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">Strings::TextSubstitutions::allow_no_further_text_subs</span><span class="plain-syntax">)</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="1-htc.html#SP2">&#167;2</a>.</li></ul>

View file

@ -88,7 +88,7 @@ which use this module:
<span class="identifier-syntax">COMPILE_WRITER</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *, </span><a href="6-inv.html#SP9" class="function-link"><span class="function-syntax">Invocations::log</span></a><span class="plain-syntax">)</span>
<span class="identifier-syntax">COMPILE_WRITER</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *, </span><a href="3-dptd.html#SP1" class="function-link"><span class="function-syntax">Phrases::TypeData::Textual::log</span></a><span class="plain-syntax">)</span>
<span class="identifier-syntax">COMPILE_WRITER</span><span class="plain-syntax">(</span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *, </span><a href="4-lv.html#SP34" class="function-link"><span class="function-syntax">LocalVariables::log</span></a><span class="plain-syntax">)</span>
<span class="identifier-syntax">COMPILE_WRITER</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *, </span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::log</span></a><span class="plain-syntax">)</span>
<span class="identifier-syntax">COMPILE_WRITER</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *, </span><a href="3-phr.html#SP6" class="function-link"><span class="function-syntax">Phrases::log</span></a><span class="plain-syntax">)</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ImperativeModule::start</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">Writers::register_writer</span><span class="plain-syntax">(</span><span class="character-syntax">'L'</span><span class="plain-syntax">, &amp;</span><a href="4-lv.html#SP43" class="function-link"><span class="function-syntax">LocalVariables::writer</span></a><span class="plain-syntax">);</span>
@ -96,7 +96,7 @@ which use this module:
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_WRITER</span><span class="plain-syntax">(</span><span class="character-syntax">'e'</span><span class="plain-syntax">, </span><a href="6-inv.html#SP9" class="function-link"><span class="function-syntax">Invocations::log</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_WRITER</span><span class="plain-syntax">(</span><span class="character-syntax">'h'</span><span class="plain-syntax">, </span><a href="3-dptd.html#SP1" class="function-link"><span class="function-syntax">Phrases::TypeData::Textual::log</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_WRITER</span><span class="plain-syntax">(</span><span class="character-syntax">'k'</span><span class="plain-syntax">, </span><a href="4-lv.html#SP34" class="function-link"><span class="function-syntax">LocalVariables::log</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_WRITER</span><span class="plain-syntax">(</span><span class="character-syntax">'R'</span><span class="plain-syntax">, </span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::log</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_WRITER</span><span class="plain-syntax">(</span><span class="character-syntax">'R'</span><span class="plain-syntax">, </span><a href="3-phr.html#SP6" class="function-link"><span class="function-syntax">Phrases::log</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Memory::reason_name</span><span class="plain-syntax">(</span><span class="constant-syntax">INV_LIST_MREASON</span><span class="plain-syntax">, </span><span class="string-syntax">"lists for type-checking invocations"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Log::declare_aspect</span><span class="plain-syntax">(</span><span class="constant-syntax">DESCRIPTION_COMPILATION_DA</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"description compilation"</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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">Log::declare_aspect</span><span class="plain-syntax">(</span><span class="constant-syntax">EXPRESSIONS_DA</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"expressions"</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>

View file

@ -92,7 +92,7 @@ and a shared set of variables, so this will not be a long section of code.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">activity</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure activity is accessed in 2/rls, 2/rlb, 2/fao, 3/prcd, 3/po, 4/sv, 6/cii, 6/cste and here.</li></ul>
<ul class="endnotetexts"><li>The structure activity is accessed in 2/rls, 2/rlb, 2/fao, 3/phr, 3/prcd, 3/po, 4/sv, 6/cii, 6/cp, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Whereas rulebooks can turn values into other values, activities are more like
void functions: they work on a value, but produce nothing.
</p>

View file

@ -430,7 +430,7 @@ BEFORE a FIRST one.)
<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">BookingLists::contains_ph</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">BookingLists::contains_ph</span></span>:<br/>Rulebooks - <a href="2-rlb.html#SP2_3">&#167;2.3</a><br/>Focus and Outcome - <a href="2-fao.html#SP5">&#167;5</a>, <a href="2-fao.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">booking_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph_to_find</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BookingLists::contains_ph</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">BookingLists::contains_ph</span></span>:<br/>Rulebooks - <a href="2-rlb.html#SP2_3">&#167;2.3</a><br/>Focus and Outcome - <a href="2-fao.html#SP5">&#167;5</a>, <a href="2-fao.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">booking_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph_to_find</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_BOOKINGS</span><span class="plain-syntax">(</span><span class="identifier-syntax">br</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">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">id</span><span class="plain-syntax"> = </span><a href="2-rls.html#SP9" class="function-link"><span class="function-syntax">Rules::get_imperative_definition</span></a><span class="plain-syntax">(</span><a href="2-rb.html#SP4" class="function-link"><span class="function-syntax">RuleBookings::get_rule</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">br</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">id</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ph_to_find</span><span class="plain-syntax">))</span>

View file

@ -186,7 +186,7 @@ rulebook.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">rulebook_outcome</span><span class="plain-syntax"> *</span><span class="function-syntax">FocusAndOutcome::rbo_from_context</span><span class="plain-syntax">(</span><span class="reserved-syntax">named_rulebook_outcome</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rbno</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">rulebook_outcome</span><span class="plain-syntax"> *</span><span class="function-syntax">FocusAndOutcome::rbo_from_context</span><span class="plain-syntax">(</span><span class="reserved-syntax">named_rulebook_outcome</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rbno</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</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>
<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="reserved-syntax">rulebook</span><span class="plain-syntax">) {</span>
@ -212,7 +212,7 @@ causing the difficulty if so.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="function-syntax">FocusAndOutcome::rulebook_not_supporting</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">FocusAndOutcome::rulebook_not_supporting</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP4_3_3">&#167;4.3.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">named_rulebook_outcome</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rbno</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="function-syntax">FocusAndOutcome::rulebook_not_supporting</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">FocusAndOutcome::rulebook_not_supporting</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP4_3_3">&#167;4.3.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">named_rulebook_outcome</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rbno</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</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>
<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="reserved-syntax">rulebook</span><span class="plain-syntax">) {</span>

View file

@ -174,13 +174,13 @@ the rulebook; instead, the booking is marked for automatic placement later on.
<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><a href="2-rls.html#SP9" class="function-link"><span class="function-syntax">Rules::get_imperative_definition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">br</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">rule_being_booked</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">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="identifier-syntax">at</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</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">original_owner</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RuleFamily::get_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</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">placement</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RuleFamily::get_rulebook_placement</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</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">original_owner</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RuleFamily::get_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</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">placement</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RuleFamily::get_rulebook_placement</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</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">owner</span><span class="plain-syntax"> = </span><span class="identifier-syntax">original_owner</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginCalls::place_rule</span><span class="plain-syntax">(</span><span class="identifier-syntax">br</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">rule_being_booked</span><span class="plain-syntax">, </span><span class="identifier-syntax">original_owner</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">owner</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">owner</span><span class="plain-syntax"> != </span><span class="identifier-syntax">original_owner</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RuleFamily::set_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">owner</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RuleFamily::set_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">owner</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">RULE_ATTACHMENTS</span><span class="plain-syntax">, </span><span class="string-syntax">"Rerouting $b: $K --&gt; $K\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">br</span><span class="plain-syntax">, </span><span class="identifier-syntax">original_owner</span><span class="plain-syntax">, </span><span class="identifier-syntax">owner</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>

View file

@ -126,7 +126,7 @@ quaint idea of having enumerated ways in which they finish (see <a href="2-fao.h
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure rulebook is accessed in 2/rls, 2/fao, 2/act, 6/cp and here.</li></ul>
<ul class="endnotetexts"><li>The structure rulebook is accessed in 2/rls, 2/fao, 2/act, 3/phr, 3/prcd, 6/cii, 6/cp and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The following creates one:
</p>

View file

@ -124,7 +124,7 @@ different dynamics altogether. In short, then: rules are not phrases.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">rule</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure rule is accessed in 2/rlb, 2/fao, 2/act, 3/prcd, 3/po, 4/sv, 6/cii, 6/cste and here.</li></ul>
<ul class="endnotetexts"><li>The structure rule is accessed in 2/rlb, 2/fao, 2/act, 3/phr, 3/prcd, 3/po, 4/sv, 6/cii, 6/cp, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Rules are created before their definitions can be parsed or compiled. A
typical rule like so:
</p>
@ -313,9 +313,7 @@ nothing.
<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>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Defining rules with imperative I7 code. </b>Once a rule has been created, it can be given a definition body in the form
of a <a href="3-phr.html#SP3" class="internal">phrase</a> as follows:
</p>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Defining rules with imperative I7 code. </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">Rules::set_imperative_definition</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><span class="identifier-syntax">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
@ -432,8 +430,8 @@ than <span class="extract"><span class="extract-syntax">R1</span></span>, or 0 i
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rules::cmp</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">Rules::cmp</span></span>:<br/>Rule Bookings - <a href="2-rb.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R1</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R2</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">log_this</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">id1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">R1</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">id2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">R2</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><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">phrcd2</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">id1</span><span class="plain-syntax">) </span><span class="identifier-syntax">phrcd1</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">id1</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</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">id2</span><span class="plain-syntax">) </span><span class="identifier-syntax">phrcd2</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">id2</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</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">id1</span><span class="plain-syntax">) </span><span class="identifier-syntax">phrcd1</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">id1</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">runtime_context_data</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">id2</span><span class="plain-syntax">) </span><span class="identifier-syntax">phrcd2</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">id2</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">runtime_context_data</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="3-prcd.html#SP7" class="function-link"><span class="function-syntax">Phrases::Context::compare_specificity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd1</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrcd2</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">log_this</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">rv</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Decided by Law %S that "</span><span class="plain-syntax">, </span><span class="identifier-syntax">c_s_stage_law</span><span class="plain-syntax">);</span>
@ -565,28 +563,28 @@ it's possible to change the way that applicability testing is done.
<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::set_always_test_actor</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">Rules::set_always_test_actor</span></span>:<br/>Rulebooks - <a href="2-rlb.html#SP8">&#167;8</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="plain-syntax"> </span><span class="reserved-syntax">if</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="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</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">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</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">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-prcd.html#SP3" class="function-link"><span class="function-syntax">Phrases::Context::set_always_test_actor</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">);</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::set_never_test_actor</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">Rules::set_never_test_actor</span></span>:<br/>Rulebooks - <a href="2-rlb.html#SP8">&#167;8</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="plain-syntax"> </span><span class="reserved-syntax">if</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="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</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">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</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">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-prcd.html#SP3" class="function-link"><span class="function-syntax">Phrases::Context::set_never_test_actor</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">);</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::set_marked_for_anyone</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><span class="reserved-syntax">int</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">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">defn_as_I7_source</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</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">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</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">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-prcd.html#SP3" class="function-link"><span class="function-syntax">Phrases::Context::set_marked_for_anyone</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</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">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rules::suppress_action_testing</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>
<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">-&gt;</span><span class="identifier-syntax">defn_as_I7_source</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</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">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</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">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-prcd.html#SP4" class="function-link"><span class="function-syntax">Phrases::Context::suppress_action_testing</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
@ -596,10 +594,10 @@ it's possible to change the way that applicability testing is done.
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd_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="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R_from</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><span class="identifier-syntax">phrcd_from</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">R_from</span><span class="plain-syntax">-&gt;</span><span class="element-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="element-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrcd_from</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">R_from</span><span class="plain-syntax">-&gt;</span><span class="element-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">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd_to</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">R_to</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><span class="identifier-syntax">phrcd_to</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">R_to</span><span class="plain-syntax">-&gt;</span><span class="element-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="element-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrcd_to</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">R_to</span><span class="plain-syntax">-&gt;</span><span class="element-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">runtime_context_data</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">phrcd_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">phrcd_from</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>

View file

@ -119,7 +119,7 @@ The debugging log is simple:
</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">Phrases::TypeData::Textual::log_briefly</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">Phrases::TypeData::Textual::log_briefly</span></span>:<br/>Phrases - <a href="3-phr.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::Textual::log_briefly</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">Phrases::TypeData::Textual::log_briefly</span></span>:<br/>Phrases - <a href="3-phr.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</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">phtd</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">"NULL-PHTD"</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">"\"%W\""</span><span class="plain-syntax">, </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">registration_text</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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">manner_of_return</span><span class="plain-syntax">) {</span>
@ -142,7 +142,7 @@ match is shown.
<span class="definition-keyword">define</span> <span class="constant-syntax">INDEX_PHRASE_FORMAT</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax"> </span><span class="comment-syntax"> a simpler version good enough for most purposes</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">Phrases::TypeData::Textual::write_HTML_representation</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::TypeData::Textual::write_HTML_representation</span></span>:<br/><a href="3-dptd.html#SP4">&#167;4</a><br/>Phrases - <a href="3-phr.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::Textual::write_HTML_representation</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::TypeData::Textual::write_HTML_representation</span></span>:<br/><a href="3-dptd.html#SP4">&#167;4</a><br/>Phrases - <a href="3-phr.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">paste_format</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">seq_from</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">seq_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_words</span><span class="plain-syntax">;</span>
@ -301,16 +301,16 @@ match is shown.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::Textual::inv_write_HTML_representation</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</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">ph</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</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">ToPhraseFamily::doc_ref</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</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="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">ToPhraseFamily::doc_ref</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</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">pds</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">pds</span><span class="plain-syntax">, </span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">ToPhraseFamily::doc_ref</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</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">pds</span><span class="plain-syntax">, </span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">ToPhraseFamily::doc_ref</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">))));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Index::DocReferences::link_to</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pds</span><span class="plain-syntax">, -1);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">pds</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">Index::link_to</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</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">Index::link_to</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</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">" "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-dptd.html#SP3" class="function-link"><span class="function-syntax">Phrases::TypeData::Textual::write_HTML_representation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">, </span><span class="constant-syntax">INDEX_PHRASE_FORMAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">inv</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>
@ -326,10 +326,10 @@ match is shown.
</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">Phrases::TypeData::Textual::write_index_representation</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">Phrases::TypeData::Textual::write_index_representation</span></span>:<br/><a href="3-dptd.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::Textual::write_index_representation</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">Phrases::TypeData::Textual::write_index_representation</span></span>:<br/><a href="3-dptd.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">manner_of_return</span><span class="plain-syntax"> == </span><span class="constant-syntax">DECIDES_CONDITION_MOR</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;if&lt;/i&gt; "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-phr.html#SP9" class="function-link"><span class="function-syntax">Phrases::write_HTML_representation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="constant-syntax">INDEX_PHRASE_FORMAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-phr.html#SP7" class="function-link"><span class="function-syntax">Phrases::write_HTML_representation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="constant-syntax">INDEX_PHRASE_FORMAT</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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">return_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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">manner_of_return</span><span class="plain-syntax"> == </span><span class="constant-syntax">DECIDES_CONDITION_MOR</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;i&gt;:&lt;/i&gt;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
@ -337,7 +337,7 @@ match is shown.
<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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">return_kind</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"value"</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">Kinds::Textual::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">return_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="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ToPhraseFamily::get_equation_form</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</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">ToPhraseFamily::get_equation_form</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</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">Wordings::nonempty</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;i&gt;y&lt;/i&gt;&amp;nbsp;=&amp;nbsp;&lt;b&gt;%+W&lt;/b&gt;(&lt;i&gt;x&lt;/i&gt;)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
@ -350,11 +350,11 @@ This is the routine which prints those details.
</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">Phrases::TypeData::Textual::write_reveal_box</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::Textual::write_reveal_box</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-dptd.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Present a paste button containing the text of the phrase</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="3-dptd.html#SP5" class="function-link"><span class="function-syntax">Phrases::TypeData::Textual::write_index_representation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-po.html#SP5" class="function-link"><span class="function-syntax">Phrases::Options::index</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_data</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="3-po.html#SP5" class="function-link"><span class="function-syntax">Phrases::Options::index</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-dptd.html#SP6_2" class="named-paragraph-link"><span class="named-paragraph">Quote from and reference to the documentation, where possible</span><span class="named-paragraph-number">6.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-dptd.html#SP6_3" class="named-paragraph-link"><span class="named-paragraph">Present the equation form of the phrase, if it has one</span><span class="named-paragraph-number">6.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-dptd.html#SP6_4" class="named-paragraph-link"><span class="named-paragraph">Present the name of the phrase regarded as a value, if it has one</span><span class="named-paragraph-number">6.4</span></a></span><span class="plain-syntax">;</span>
@ -368,7 +368,7 @@ This is the routine which prints those details.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="3-phr.html#SP9" class="function-link"><span class="function-syntax">Phrases::write_HTML_representation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="constant-syntax">PASTE_PHRASE_FORMAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-phr.html#SP7" class="function-link"><span class="function-syntax">Phrases::write_HTML_representation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="constant-syntax">PASTE_PHRASE_FORMAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PasteButtons::paste_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEMP</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">TEMP</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">"&amp;nbsp;"</span><span class="plain-syntax">);</span>
@ -382,10 +382,10 @@ of course.
</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">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">ToPhraseFamily::doc_ref</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-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">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">ToPhraseFamily::doc_ref</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</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="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">pds</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">pds</span><span class="plain-syntax">, </span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">ToPhraseFamily::doc_ref</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</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">pds</span><span class="plain-syntax">, </span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">ToPhraseFamily::doc_ref</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">))));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Index::DocReferences::doc_fragment</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pds</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;See&lt;/b&gt; "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Index::DocReferences::fully_link</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pds</span><span class="plain-syntax">);</span>
@ -397,7 +397,7 @@ of course.
</p>
<pre class="displayed-code all-displayed-code code-font">
<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">ToPhraseFamily::get_equation_form</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</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">ToPhraseFamily::get_equation_form</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</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">Wordings::nonempty</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">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">HTML_OPEN</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
@ -411,7 +411,7 @@ of course.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">CW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ToPhraseFamily::constant_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</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">CW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ToPhraseFamily::constant_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</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">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">CW</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="identifier-syntax">HTML_OPEN</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
@ -441,7 +441,7 @@ so we won't list them here.
</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><a href="3-ptd.html#SP18" class="function-link"><span class="function-syntax">Phrases::TypeData::deprecated</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-ptd.html#SP18" class="function-link"><span class="function-syntax">Phrases::TypeData::deprecated</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</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">HTML_OPEN</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;b&gt;Warning:&lt;/b&gt; "</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">"This phrase is now deprecated! It will probably be withdrawn in "</span>

View file

@ -21,7 +21,6 @@ function togglePopup(material_id) {
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Preform-Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
@ -73,7 +72,7 @@ function togglePopup(material_id) {
<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#3">Chapter 3: Phrases</a></li><li><b>Phrases</b></li></ul></div>
<p class="purpose">To create one |phrase| object for each phrase declaration in the source text.</p>
<ul class="toc"><li><a href="3-phr.html#SP8">&#167;8. Miscellaneous</a></li><li><a href="3-phr.html#SP11">&#167;11. Compilation</a></li><li><a href="3-phr.html#SP12">&#167;12. Basic mode main</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="3-phr.html#SP6">&#167;6. Miscellaneous</a></li><li><a href="3-phr.html#SP9">&#167;9. Compilation</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>As noted in the introduction to this chapter, a <span class="extract"><span class="extract-syntax">phrase</span></span> structure is
created for each "To..." definition and each rule in the source text. It is
@ -103,337 +102,140 @@ code below.
</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">phrase</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">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</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">ph_compilation_data</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">inline_mor</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the </span><span class="extract"><span class="extract-syntax">*_MOR</span></span><span class="comment-syntax"> values above</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">inline_wn</span><span class="plain-syntax">; </span><span class="comment-syntax"> word number of inline I6 definition, or </span><span class="extract"><span class="extract-syntax">-1</span></span><span class="comment-syntax"> if not inline</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inter_head_defn</span><span class="plain-syntax">; </span><span class="comment-syntax"> inline definition translated to inter, if possible</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inter_tail_defn</span><span class="plain-syntax">; </span><span class="comment-syntax"> inline definition translated to inter, if possible</span>
<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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">inline_mor</span><span class="plain-syntax">; </span><span class="comment-syntax"> manner of return for inline I6 definition, or </span><span class="extract"><span class="extract-syntax">UNKNOWN_NT</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">compilation_unit</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owning_module</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">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="reserved-syntax">ph_type_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">type_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="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">runtime_context_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="reserved-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="reserved-syntax">ph_options_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">options_data</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">at_least_one_compiled_form_needed</span><span class="plain-syntax">; </span><span class="comment-syntax"> do we still need to compile this?</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">compile_with_run_time_debugging</span><span class="plain-syntax">; </span><span class="comment-syntax"> in the RULES command</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">at_least_one_compiled_form_needed</span><span class="plain-syntax">; </span><span class="comment-syntax"> do we still need to compile this?</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">compilation_unit</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owning_module</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_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inter_front</span><span class="plain-syntax">; </span><span class="comment-syntax"> inline definition translated to inter, if possible</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inter_back</span><span class="plain-syntax">; </span><span class="comment-syntax"> inline definition translated to inter, if possible</span>
<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="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">phrase</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">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="reserved-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">ph_compilation_data</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure phrase is accessed in 2/rls, 2/rb, 3/prcd, 3/ptd, 3/dptd, 3/po, 6/inv, 6/pi, 6/ci, 6/cii, 6/cp, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>The life of a <span class="extract"><span class="extract-syntax">phrase</span></span> structure begins when we look at the parse-tree
representation of its declaration in the source text.
</p>
<p class="commentary">A phrase is inline if and only if its definition consists of a single
invocation which is given as verbatim I6.
</p>
<ul class="endnotetexts"><li>The structure ph_compilation_data is accessed in 3/prcd, 6/cii, 6/cp and here.</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="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::create_from_preamble</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="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</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">p</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) != </span><span class="identifier-syntax">IMPERATIVE_NT</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">"a phrase preamble should be at a IMPERATIVE_NT node"</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">inline_wn</span><span class="plain-syntax"> = -1; </span><span class="comment-syntax"> the word number of an inline I6 definition if any</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="constant-syntax">DONT_KNOW_MOR</span><span class="plain-syntax">; </span><span class="comment-syntax"> and its manner of return</span>
<span class="reserved-syntax">ph_compilation_data</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::new_compilation_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</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">ph_compilation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">phcd</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">inline_wn</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phcd</span><span class="plain-syntax">.</span><span class="element-syntax">inter_front</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">inter_back</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">inter_defn_converted</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">inline_mor</span><span class="plain-syntax"> = </span><span class="constant-syntax">DONT_KNOW_MOR</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">ph_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">phcd</span><span class="plain-syntax">.</span><span class="element-syntax">owning_module</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CompilationUnits::find</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">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><a href="4-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="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>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-phr.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Look for an inline definition</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">ph_options_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">phtd</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="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">phrcd</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">inline_wn</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">ImperativeDefinitionFamilies::allows_inline</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</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="3-phr.html#SP4_7" class="named-paragraph-link"><span class="named-paragraph">Inline is for To... phrases only</span><span class="named-paragraph-number">4.7</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-phr.html#SP4_2" class="named-paragraph-link"><span class="named-paragraph">Construct the PHOD</span><span class="named-paragraph-number">4.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-phr.html#SP4_3" class="named-paragraph-link"><span class="named-paragraph">Construct the PHTD, find the phrase options, find the documentation reference</span><span class="named-paragraph-number">4.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-phr.html#SP4_4" class="named-paragraph-link"><span class="named-paragraph">Construct the PHSF, using the PHTD and PHOD</span><span class="named-paragraph-number">4.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-phr.html#SP4_5" class="named-paragraph-link"><span class="named-paragraph">Construct the PHRCD</span><span class="named-paragraph-number">4.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new_ph</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-phr.html#SP4_6" class="named-paragraph-link"><span class="named-paragraph">Create the phrase structure</span><span class="named-paragraph-number">4.6</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">new_ph</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::make_inline</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">inline_wn</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="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inline_wn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">inline_wn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inline_mor</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mor</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-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="identifier-syntax">FALSE</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">Look for an inline definition</span><span class="named-paragraph-number">4.1</span></span><span class="comment-syntax"> =</span>
</p>
<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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="3-phr.html#SP6" class="function-link"><span class="function-syntax">Phrases::parse_possible_inline_defn</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">), &amp;</span><span class="identifier-syntax">inline_wn</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">mor</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">inline_wn</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">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inline_defn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lexer::word_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">inline_wn</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">Wide::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">inline_defn</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">MAX_INLINE_DEFN_LENGTH</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-phr.html#SP4_1_1" class="named-paragraph-link"><span class="named-paragraph">Forbid overly long inline definitions</span><span class="named-paragraph-number">4.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-phr.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">Construct the PHOD</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">phod</span><span class="plain-syntax"> = </span><a href="3-po.html#SP3" class="function-link"><span class="function-syntax">Phrases::Options::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-phr.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4_3" class="paragraph-anchor"></a><b>&#167;4.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Construct the PHTD, find the phrase options, find the documentation reference</span><span class="named-paragraph-number">4.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">phtd</span><span class="plain-syntax"> = </span><a href="3-ptd.html#SP9" class="function-link"><span class="function-syntax">Phrases::TypeData::new</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">inline_wn</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><a href="3-ptd.html#SP25" class="function-link"><span class="function-syntax">Phrases::TypeData::make_inline</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-phr.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4_4" class="paragraph-anchor"></a><b>&#167;4.4. </b>The stack frame needs to know the kind of this phrase &mdash; something like
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> </span><span class="identifier-syntax">number</span><span class="plain-syntax"> -&gt; </span><span class="identifier-syntax">text</span>
</pre>
<p class="commentary">&mdash; in order to work out what happens when values are decided by it later on.
We also tell the stack frame if there are phrase options, because then a
special parameter called <span class="extract"><span class="extract-syntax">{phrase options}</span></span> is available when expanding
inline definitions.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Construct the PHSF, using the PHTD and PHOD</span><span class="named-paragraph-number">4.4</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">phsf</span><span class="plain-syntax"> = </span><a href="4-sf.html#SP4" class="function-link"><span class="function-syntax">Frames::new</span></a><span class="plain-syntax">();</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-phr.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4_5" class="paragraph-anchor"></a><b>&#167;4.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Construct the PHRCD</span><span class="named-paragraph-number">4.5</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">phrcd</span><span class="plain-syntax"> = </span><a href="3-prcd.html#SP2" class="function-link"><span class="function-syntax">Phrases::Context::new</span></a><span class="plain-syntax">();</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-phr.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4_6" class="paragraph-anchor"></a><b>&#167;4.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Create the phrase structure</span><span class="named-paragraph-number">4.6</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">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">PHRASE_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Creating phrase: &lt;%W&gt;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">log_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</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">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phod</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-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">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inline_wn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">inline_wn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_head_defn</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">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_tail_defn</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">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_defn_converted</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">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inline_mor</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mor</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ph_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">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_module</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CompilationUnits::find</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">new_ph</span><span class="plain-syntax">-&gt;</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="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">inline_wn</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">new_ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">at_least_one_compiled_form_needed</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="identifier-syntax">new_ph</span><span class="plain-syntax">-&gt;</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="plain-syntax"> </span><span class="identifier-syntax">new_ph</span><span class="plain-syntax">-&gt;</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>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-phr.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4_1_1" class="paragraph-anchor"></a><b>&#167;4.1.1. </b>That just leaves two problem messages about inline definitions:
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Forbid overly long inline definitions</span><span class="named-paragraph-number">4.1.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">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Inline definition: &lt;%s&gt;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">inline_defn</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_InlineTooLong</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the inline definition of this 'to...' phrase is too long"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"using a quantity of Inform 6 code which exceeds the fairly small limit "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"allowed. You will need either to write the phrase definition in Inform 7, "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"or to call an I6 routine which you define elsewhere with an 'Include ...'."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inline_defn</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_INLINE_DEFN_LENGTH</span><span class="plain-syntax">-1] = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-phr.html#SP4_1">&#167;4.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4_7" class="paragraph-anchor"></a><b>&#167;4.7. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline is for To... phrases only</span><span class="named-paragraph-number">4.7</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">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_InlineRule</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"only 'to...' phrases can be given inline Inform 6 definitions"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"and in particular rules and adjective definitions can't."</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-phr.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>Inline definitions open with a raw Inform 6 inclusion. The lexer processes
those as two words: first <span class="extract"><span class="extract-syntax">(-</span></span>, which serves as a marker, and then the raw
text of the inclusion treated as a single "word".
</p>
<p class="commentary">Some inline definitions also mark themselves to be included only in To phrases
of the right sort: it makes no sense to respond "yes" to a phrase "To decide
what number is...", for instance.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;inline-phrase-definition&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">(-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">###</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">in</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">only</span><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"> { DECIDES_NOTHING_MOR, -, &lt;&lt;inlinecode&gt;&gt; = Wordings::first_wn(WR[1]) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">(-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">###</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">in</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">decide</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">if</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">only</span><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"> { DECIDES_CONDITION_MOR, -, &lt;&lt;inlinecode&gt;&gt; = Wordings::first_wn(WR[1]) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">(-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">###</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">in</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">decide</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">only</span><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"> { DECIDES_VALUE_MOR, -, &lt;&lt;inlinecode&gt;&gt; = Wordings::first_wn(WR[1]) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">(-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">###</span><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"> { DONT_KNOW_MOR, -, &lt;&lt;inlinecode&gt;&gt; = Wordings::first_wn(WR[1]) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">(-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">###</span><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"> { DONT_KNOW_MOR, -, &lt;&lt;inlinecode&gt;&gt; = Wordings::first_wn(WR[1]) }; </span><span class="named-paragraph-container code-font"><a href="3-phr.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_TailAfterInline problem</span><span class="named-paragraph-number">5.1</span></a></span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<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 PM_TailAfterInline problem</span><span class="named-paragraph-number">5.1</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<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_TailAfterInline</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"some unexpected text appears after the tail of an inline definition"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"placed within '(-' and '-)' markers to indicate that it is written in "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Inform 6. Here, there seems to be something extra after the '-)'."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { </span><span class="constant-syntax">DONT_KNOW_MOR</span><span class="plain-syntax">, - };</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-phr.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>And this is used when the preamble is first looked at:
</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">Phrases::parse_possible_inline_defn</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">Phrases::parse_possible_inline_defn</span></span>:<br/><a href="3-phr.html#SP4_1">&#167;4.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="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wn</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="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">MATCHING</span><span class="plain-syntax">, </span><span class="string-syntax">"form of inline: %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="identifier-syntax">wn</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;inline-phrase-definition&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) { *</span><span class="identifier-syntax">wn</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;inlinecode&gt;&gt;</span><span class="plain-syntax">; *</span><span class="identifier-syntax">mor</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax">; }</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::prepare_stack_frame</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="3-ptd.html#SP19" class="function-link"><span class="function-syntax">Phrases::TypeData::into_stack_frame</span></a><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="element-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"> </span><a href="3-ptd.html#SP12" class="function-link"><span class="function-syntax">Phrases::TypeData::kind</span></a><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><a href="3-po.html#SP3" class="function-link"><span class="function-syntax">Phrases::Options::allows_options</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><a href="4-lv.html#SP13" class="function-link"><span class="function-syntax">LocalVariables::options_parameter_is_needed</span></a><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="element-syntax">stack_frame</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></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">Phrases::prepare_stack_frame</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="3-ptd.html#SP19" class="function-link"><span class="function-syntax">Phrases::TypeData::into_stack_frame</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stack_frame</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><a href="3-ptd.html#SP12" class="function-link"><span class="function-syntax">Phrases::TypeData::kind</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="element-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><a href="3-po.html#SP3" class="function-link"><span class="function-syntax">Phrases::Options::allows_options</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_data</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><a href="4-lv.html#SP13" class="function-link"><span class="function-syntax">LocalVariables::options_parameter_is_needed</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stack_frame</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. Miscellaneous. </b>That completes the process of creation. Here's how we log them:
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Miscellaneous. </b>That completes the process of creation. Here's how we log 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">Phrases::log</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">Phrases::log</span></span>:<br/>Imperative Module - <a href="1-im.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::log</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">Phrases::log</span></span>:<br/>Imperative Module - <a href="1-im.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</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">"RULE:NULL"</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">"%n"</span><span class="plain-syntax">, </span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</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">"%n"</span><span class="plain-syntax">, </span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</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">Phrases::log_briefly</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::log_briefly</span></span>:<br/>Invocations - <a href="6-inv.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="3-dptd.html#SP2" class="function-link"><span class="function-syntax">Phrases::TypeData::Textual::log_briefly</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">));</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::log_briefly</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">Phrases::log_briefly</span></span>:<br/>Invocations - <a href="6-inv.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="3-dptd.html#SP2" class="function-link"><span class="function-syntax">Phrases::TypeData::Textual::log_briefly</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</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>Relatedly, for indexing purposes:
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>Relatedly, for indexing purposes:
</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">Phrases::write_HTML_representation</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">Phrases::write_HTML_representation</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP5">&#167;5</a>, <a href="3-dptd.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="3-dptd.html#SP3" class="function-link"><span class="function-syntax">Phrases::TypeData::Textual::write_HTML_representation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">format</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::write_HTML_representation</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::write_HTML_representation</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP5">&#167;5</a>, <a href="3-dptd.html#SP6_1">&#167;6.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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="3-dptd.html#SP3" class="function-link"><span class="function-syntax">Phrases::TypeData::Textual::write_HTML_representation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">format</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="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>Some access functions:
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>Some 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">Phrases::compiled_inline</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inline_wn</span><span class="plain-syntax"> &lt; </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">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::compiled_inline</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inline_wn</span><span class="plain-syntax"> &lt; </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">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">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::get_inline_definition</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inline_wn</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::get_inline_definition</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inline_wn</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</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 access inline definition of non-inline phrase"</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">Lexer::word_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inline_wn</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">Lexer::word_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inline_wn</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::get_inter_head</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">Phrases::get_inter_head</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP1_3">&#167;1.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_defn_converted</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inline_wn</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">InterSchemas::from_inline_phrase_definition</span><span class="plain-syntax">(</span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::get_inline_definition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_head_defn</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_tail_defn</span><span class="plain-syntax">));</span>
<span class="identifier-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::get_inter_head</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">Phrases::get_inter_head</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP1_3">&#167;1.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inter_defn_converted</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">inline_wn</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">InterSchemas::from_inline_phrase_definition</span><span class="plain-syntax">(</span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::get_inline_definition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inter_front</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inter_back</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_defn_converted</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inter_defn_converted</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_head_defn</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inter_front</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::get_inter_tail</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">Phrases::get_inter_tail</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP1_3">&#167;1.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_defn_converted</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inline_wn</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">InterSchemas::from_inline_phrase_definition</span><span class="plain-syntax">(</span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::get_inline_definition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_head_defn</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_tail_defn</span><span class="plain-syntax">));</span>
<span class="identifier-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::get_inter_tail</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">Phrases::get_inter_tail</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP1_3">&#167;1.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inter_defn_converted</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">inline_wn</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">InterSchemas::from_inline_phrase_definition</span><span class="plain-syntax">(</span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::get_inline_definition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inter_front</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inter_back</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_defn_converted</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inter_defn_converted</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inter_tail_defn</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inter_back</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">Phrases::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">Phrases::iname</span></span>:<br/><a href="3-phr.html#SP8">&#167;8</a><br/>Phrase Runtime Context Data - <a href="3-prcd.html#SP9">&#167;9</a>, <a href="3-prcd.html#SP9_1">&#167;9.1</a><br/>Compile Phrases - <a href="6-cp.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ph_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">PR</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::package</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_module</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADJECTIVE_PHRASES_HAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ph_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::make_iname_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">DEFINITION_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">PR</span><span class="plain-syntax">);</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::iname</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">Phrases::iname</span></span>:<br/><a href="3-phr.html#SP6">&#167;6</a><br/>Phrase Runtime Context Data - <a href="3-prcd.html#SP9">&#167;9</a>, <a href="3-prcd.html#SP9_1">&#167;9.1</a><br/>Compile Phrases - <a href="6-cp.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">ph_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">PR</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::package</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">owning_module</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADJECTIVE_PHRASES_HAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">ph_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::make_iname_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">DEFINITION_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">PR</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ph_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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">ph_iname</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">Phrases::declaration_node</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::declaration_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</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. Compilation. </b>The following is called to give us an opportunity to compile a routine defining
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Compilation. </b>The following is called to give us an opportunity to compile a routine defining
a phrase. As was mentioned in the introduction, "To..." phrases are sometimes
compiled multiple times, for different kinds of tokens, and are compiled in
response to "requests". All other phrases are compiled just once.
</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">Phrases::compile</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::compile</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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="reserved-syntax">stacked_variable_owner_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="reserved-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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">at_least_one_compiled_form_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">req</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-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><a href="6-cp.html#SP2" class="function-link"><span class="function-syntax">Routines::Compile::routine</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</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="named-paragraph-container code-font"><a href="3-phr.html#SP11_1" class="named-paragraph-link"><span class="named-paragraph">Move along the progress bar if it's this phrase's first compilation</span><span class="named-paragraph-number">11.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11_1" class="paragraph-anchor"></a><b>&#167;11.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Move along the progress bar if it's this phrase's first compilation</span><span class="named-paragraph-number">11.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">ph</span><span class="plain-syntax">-&gt;</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">at_least_one_compiled_form_needed</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">i</span><span class="plain-syntax">)++;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ProgressBar::update</span><span class="plain-syntax">(4, ((</span><span class="reserved-syntax">float</span><span class="plain-syntax">) (*</span><span class="identifier-syntax">i</span><span class="plain-syntax">))/((</span><span class="reserved-syntax">float</span><span class="plain-syntax">) </span><span class="identifier-syntax">max_i</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-phr.html#SP11">&#167;11</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Basic mode main. </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">Phrases::invoke_to_begin</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">Task::begin_execution_af_to_begin</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">SUBMAIN_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><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">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">beginner</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ToPhraseFamily::to_begin</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">beginner</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">void_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::function_kind</span><span class="plain-syntax">(0, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_nil</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">IS</span><span class="plain-syntax"> = </span><a href="6-cp.html#SP3" class="function-link"><span class="function-syntax">Routines::Compile::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">beginner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PhraseRequests::make_request</span><span class="plain-syntax">(</span><span class="identifier-syntax">beginner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">void_kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">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">IS</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">at_least_one_compiled_form_needed</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">at_least_one_compiled_form_needed</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">i</span><span class="plain-syntax">)++;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ProgressBar::update</span><span class="plain-syntax">(4, ((</span><span class="reserved-syntax">float</span><span class="plain-syntax">) (*</span><span class="identifier-syntax">i</span><span class="plain-syntax">))/((</span><span class="reserved-syntax">float</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="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">Hierarchy::make_available</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="plain-syntax">}</span>
</pre>

View file

@ -113,7 +113,7 @@ valid as values, since a condition is not also a value in Inform 7.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">ph_options_data</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::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">Phrases::Options::new</span></span>:<br/>Phrases - <a href="3-phr.html#SP4_2">&#167;4.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="reserved-syntax">ph_options_data</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::new</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">ph_options_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">.</span><span class="element-syntax">no_options_permitted</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">phod</span><span class="plain-syntax">.</span><span class="element-syntax">multiple_options_permitted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -121,7 +121,7 @@ valid as values, since a condition is not also a value in Inform 7.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">phod</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">Phrases::Options::allows_options</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">Phrases::Options::allows_options</span></span>:<br/>Phrases - <a href="3-phr.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::allows_options</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">Phrases::Options::allows_options</span></span>:<br/>Phrases - <a href="3-phr.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</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">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_options_permitted</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>
@ -132,7 +132,7 @@ these are relatively rare in Inform source text.
</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">Phrases::Options::parse</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::Options::parse</span></span>:<br/><a href="3-po.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</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">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::parse</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">Phrases::Options::parse</span></span>:<br/><a href="3-po.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</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">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="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_options_permitted</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">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_permitted</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</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="reserved-syntax">return</span><span class="plain-syntax"> (1 &lt;&lt; </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
@ -142,7 +142,7 @@ these are relatively rare in Inform source text.
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Indexing. </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">Phrases::Options::index</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">Phrases::Options::index</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">ph_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::index</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::Options::index</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">ph_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</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;phod-&gt;</span><span class="element-syntax">no_options_permitted</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">phrase_option</span><span class="plain-syntax"> *</span><span class="identifier-syntax">po</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_permitted</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"</span><span class="plain-syntax">);</span>
@ -167,7 +167,7 @@ these are relatively rare in Inform source text.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">ph_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::parse_declared_options</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</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::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
@ -241,7 +241,7 @@ For example, in:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">too_many_POs_error</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">Phrases::Options::phod_add_phrase_option</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">Phrases::Options::phod_add_phrase_option</span></span>:<br/><a href="3-po.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</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">Phrases::Options::phod_add_phrase_option</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">Phrases::Options::phod_add_phrase_option</span></span>:<br/><a href="3-po.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</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">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">PHRASE_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Adding phrase option &lt;%W&gt;\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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_options_permitted</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_OPTIONS_PER_PHRASE</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">too_many_POs_error</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
@ -289,11 +289,11 @@ produce.
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed_silently</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="comment-syntax"> context for the grammar below</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::parse_invoked_options</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">silently</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</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><a href="6-inv.html#SP19" class="function-link"><span class="function-syntax">Invocations::get_phrase_options</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ph</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph_being_parsed</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph_being_parsed</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</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">bitmap</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">problem_count</span><span class="plain-syntax">;</span>

View file

@ -147,11 +147,11 @@ rulebooks reach them.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</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">Phrases::Context::phrase_fits_rule_context</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">Phrases::Context::phrase_fits_rule_context</span></span>:<br/>Booking Lists - <a href="2-bl.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule_context</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::phrase_fits_rule_context</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">Phrases::Context::phrase_fits_rule_context</span></span>:<br/>Booking Lists - <a href="2-bl.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule_context</span><span class="plain-syntax"> </span><span class="identifier-syntax">rc</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="identifier-syntax">scene_context</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">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">ph</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="3-prcd.html#SP5" class="function-link"><span class="function-syntax">Phrases::Context::get_scene</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">)) != </span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="element-syntax">scene_context</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="3-prcd.html#SP5" class="function-link"><span class="function-syntax">Phrases::Context::get_scene</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">)) != </span><span class="identifier-syntax">rc</span><span class="plain-syntax">.</span><span class="element-syntax">scene_context</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><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
@ -180,7 +180,7 @@ the following only blanks out a PHRCD structure ready for that to happen.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::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">Phrases::Context::new</span></span>:<br/>Phrases - <a href="3-phr.html#SP4_5">&#167;4.5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::new</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_runtime_context_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">.</span><span class="identifier-syntax">activity_context</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">phrcd</span><span class="plain-syntax">.</span><span class="identifier-syntax">avl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
@ -199,31 +199,31 @@ the following only blanks out a PHRCD structure ready for that to happen.
</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">Phrases::Context::set_always_test_actor</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::Context::set_always_test_actor</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::set_always_test_actor</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">Phrases::Context::set_always_test_actor</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</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><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">always_test_actor</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">endif</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::clear_always_test_actor</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">Phrases::Context::clear_always_test_actor</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::clear_always_test_actor</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::Context::clear_always_test_actor</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</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><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">always_test_actor</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">endif</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::set_never_test_actor</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">Phrases::Context::set_never_test_actor</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::set_never_test_actor</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">Phrases::Context::set_never_test_actor</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</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><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">never_test_actor</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">endif</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::set_marked_for_anyone</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">Phrases::Context::set_marked_for_anyone</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::set_marked_for_anyone</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">Phrases::Context::set_marked_for_anyone</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">marked_for_anyone</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">endif</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::get_marked_for_anyone</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">Phrases::Context::get_marked_for_anyone</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::get_marked_for_anyone</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">Phrases::Context::get_marked_for_anyone</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</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><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">marked_for_anyone</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
@ -251,7 +251,7 @@ the following only blanks out a PHRCD structure ready for that to happen.
<span class="plain-syntax">}</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">endif</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::suppress_action_testing</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">Phrases::Context::suppress_action_testing</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::suppress_action_testing</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">Phrases::Context::suppress_action_testing</span></span>:<br/>Rules - <a href="2-rls.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">) </span><span class="identifier-syntax">ActionPatterns::suppress_action_testing</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
@ -265,7 +265,7 @@ extracts a single specified scene if there is one:
<pre class="displayed-code all-displayed-code code-font">
<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="identifier-syntax">scene</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::Context::get_scene</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">Phrases::Context::get_scene</span></span>:<br/><a href="3-prcd.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">scene</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::Context::get_scene</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">Phrases::Context::get_scene</span></span>:<br/><a href="3-prcd.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</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">phrcd</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_rvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">during_scene</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">q</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_instance</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">during_scene</span><span class="plain-syntax">);</span>
@ -280,9 +280,9 @@ normally limited to the use of rules in particular rulebooks.
</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">Phrases::Context::outcome_restrictions_waived</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">Phrases::Context::outcome_restrictions_waived</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP4_3_3">&#167;4.3.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::outcome_restrictions_waived</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">Phrases::Context::outcome_restrictions_waived</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP4_3_3">&#167;4.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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">.</span><span class="element-syntax">permit_all_outcomes</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">.</span><span class="element-syntax">permit_all_outcomes</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="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>
@ -299,7 +299,7 @@ all of them fail to decide, we return 0.
</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">Phrases::Context::compare_specificity</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">Phrases::Context::compare_specificity</span></span>:<br/>Rules - <a href="2-rls.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rcd1</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::compare_specificity</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">Phrases::Context::compare_specificity</span></span>:<br/>Rules - <a href="2-rls.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rcd1</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rcd2</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><span class="identifier-syntax">action_pattern</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ap1</span><span class="plain-syntax">, *</span><span class="identifier-syntax">ap2</span><span class="plain-syntax">;</span>
@ -439,16 +439,16 @@ process.
</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">Phrases::Context::ensure_avl</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">Phrases::Context::ensure_avl</span></span>:<br/>Rulebooks - <a href="2-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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::ensure_avl</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">Phrases::Context::ensure_avl</span></span>:<br/>Rulebooks - <a href="2-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="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><a href="2-rls.html#SP9" class="function-link"><span class="function-syntax">Rules::get_imperative_definition</span></a><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">id</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</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">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">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="identifier-syntax">at</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"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stack_frame</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"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-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><a href="4-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="4-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">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables_visible_in_definition</span><span class="plain-syntax">);</span>
@ -482,9 +482,9 @@ much.
</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">Phrases::Context::compile_test_head</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">Phrases::Context::compile_test_head</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::compile_test_head</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">Phrases::Context::compile_test_head</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</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">RTRules::compile_constraint</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">) == </span><span class="identifier-syntax">TRUE</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>
@ -496,7 +496,7 @@ much.
<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">phrcd</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="named-paragraph-container code-font"><a href="3-prcd.html#SP9_9" class="named-paragraph-link"><span class="named-paragraph">Compile an activity or explicit condition test head</span><span class="named-paragraph-number">9.9</span></a></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">tests</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compile_with_run_time_debugging</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">tests</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">compile_with_run_time_debugging</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">IF_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_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">DEBUG_RULES_HL</span><span class="plain-syntax">));</span>
@ -514,8 +514,8 @@ much.
<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">Phrases::Context::actions_compile_test_head</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tests</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::actions_compile_test_head</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tests</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">during_scene</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_2" class="named-paragraph-link"><span class="named-paragraph">Compile a scene test head</span><span class="named-paragraph-number">9.2</span></a></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">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_5" class="named-paragraph-link"><span class="named-paragraph">Compile possibly testing actor action test head</span><span class="named-paragraph-number">9.5</span></a></span>
@ -524,9 +524,9 @@ much.
<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">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::actions_compile_test_tail</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::actions_compile_test_tail</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_6" class="named-paragraph-link"><span class="named-paragraph">Compile an action test tail</span><span class="named-paragraph-number">9.6</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">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">always_test_actor</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_8" class="named-paragraph-link"><span class="named-paragraph">Compile an actor-is-player test tail</span><span class="named-paragraph-number">9.8</span></a></span><span class="plain-syntax">;</span>
@ -540,10 +540,10 @@ with the default outcome return (see above).
</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">Phrases::Context::compile_test_tail</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">Phrases::Context::compile_test_tail</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">runtime_context_data</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">rb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RuleFamily::get_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::compile_test_tail</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">Phrases::Context::compile_test_tail</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</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">rb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RuleFamily::get_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</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">rb</span><span class="plain-syntax">) </span><span class="identifier-syntax">RTRules::compile_default_outcome</span><span class="plain-syntax">(</span><a href="2-rlb.html#SP2_2" class="function-link"><span class="function-syntax">Rulebooks::get_outcomes</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">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">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</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="named-paragraph-container code-font"><a href="3-prcd.html#SP9_1_1" class="named-paragraph-link"><span class="named-paragraph">Compile an activity or explicit condition test tail</span><span class="named-paragraph-number">9.1.1</span></a></span><span class="plain-syntax">;</span>
@ -718,7 +718,7 @@ with the default outcome return (see above).
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next</span><span class="plain-syntax">; </span><span class="comment-syntax"> next in activity list</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">activity_list</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::count_avl</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">Phrases::Context::count_avl</span></span>:<br/><a href="3-prcd.html#SP7_4">&#167;7.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">avl</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::count_avl</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">Phrases::Context::count_avl</span></span>:<br/><a href="3-prcd.html#SP7_4">&#167;7.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">avl</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><span class="constant-syntax">0</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">avl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> += </span><span class="constant-syntax">10</span><span class="plain-syntax">;</span>
@ -728,7 +728,7 @@ with the default outcome return (see above).
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure activity_list is accessed in 2/rlb, 2/act, 3/phr, 4/lv, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li></ul>
<ul class="endnotetexts"><li>The structure activity_list is accessed in 2/rlb, 2/act, 4/lv, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>Run-time contexts are seen in the "while" clauses at the end of rules.
For example:
</p>
@ -885,7 +885,7 @@ values, of the kind to which the activity applies.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::Context::parse_avl</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">Phrases::Context::parse_avl</span></span>:<br/><a href="3-prcd.html#SP8">&#167;8</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">activity_list</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::Context::parse_avl</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">Phrases::Context::parse_avl</span></span>:<br/><a href="3-prcd.html#SP8">&#167;8</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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">save_pac</span><span class="plain-syntax"> = </span><span class="identifier-syntax">parsing_al_conditions</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parsing_al_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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;run-time-context&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>

View file

@ -296,7 +296,7 @@ whistles and doodads which regular phrases don't.
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Creation. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::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">Phrases::TypeData::new</span></span>:<br/>Phrases - <a href="3-phr.html#SP4_3">&#167;4.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::new</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_type_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">.</span><span class="element-syntax">registration_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
@ -317,16 +317,16 @@ whistles and doodads which regular phrases don't.
</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">Phrases::TypeData::set_mor</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">Phrases::TypeData::set_mor</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP16">&#167;16</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</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">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">Phrases::TypeData::set_mor</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">Phrases::TypeData::set_mor</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP16">&#167;16</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</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">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">phtd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">manner_of_return</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mor</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">return_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">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::get_mor</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::TypeData::get_mor</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP3_1_1_4_7_1">&#167;3.1.1.4.7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::get_mor</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">Phrases::TypeData::get_mor</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP3_1_1_4_7_1">&#167;3.1.1.4.7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">manner_of_return</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">Phrases::TypeData::get_return_kind</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">Phrases::TypeData::get_return_kind</span></span>:<br/><a href="3-ptd.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::TypeData::get_return_kind</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::TypeData::get_return_kind</span></span>:<br/><a href="3-ptd.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">manner_of_return</span><span class="plain-syntax"> == </span><span class="constant-syntax">DECIDES_CONDITION_MOR</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K_truth_state</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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">return_kind</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -334,7 +334,7 @@ whistles and doodads which regular phrases don't.
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::TypeData::describe_manner_of_return</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">Phrases::TypeData::describe_manner_of_return</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP1">&#167;1</a><br/>Compile Invocations - <a href="6-ci.html#SP2_1_1_2">&#167;2.1.1.2</a></span></button><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="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</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="function-syntax">Phrases::TypeData::describe_manner_of_return</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">Phrases::TypeData::describe_manner_of_return</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP1">&#167;1</a><br/>Compile Invocations - <a href="6-ci.html#SP2_1_1_2">&#167;2.1.1.2</a></span></button><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="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</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">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">mor</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">DECIDES_NOTHING_MOR:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"no value resulting"</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">DECIDES_VALUE_MOR:</span>
@ -403,7 +403,7 @@ logic, since one argument is in effect a kind rather than a value.)
</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">Phrases::TypeData::kind</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">Phrases::TypeData::kind</span></span>:<br/><a href="3-ptd.html#SP13">&#167;13</a><br/>Phrases - <a href="3-phr.html#SP7">&#167;7</a><br/>Describing Phrase Type Data - <a href="3-dptd.html#SP6_5">&#167;6.5</a><br/>Parse Invocations - <a href="6-pi.html#SP3">&#167;3</a><br/>Compile Phrases - <a href="6-cp.html#SP2_2">&#167;2.2</a><br/>Compile Solutions to Equations - <a href="6-cste.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::TypeData::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">Phrases::TypeData::kind</span></span>:<br/><a href="3-ptd.html#SP13">&#167;13</a><br/>Phrases - <a href="3-phr.html#SP5">&#167;5</a><br/>Describing Phrase Type Data - <a href="3-dptd.html#SP6_5">&#167;6.5</a><br/>Parse Invocations - <a href="6-pi.html#SP3">&#167;3</a><br/>Compile Phrases - <a href="6-cp.html#SP2_2">&#167;2.2</a><br/>Compile Solutions to Equations - <a href="6-cste.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</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">argument_kinds</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_TOKENS_PER_PHRASE</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">i</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">for</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;phtd-&gt;</span><span class="element-syntax">no_tokens</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
@ -437,7 +437,7 @@ logic, since one argument is in effect a kind rather than a value.)
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. The tokens. </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">Phrases::TypeData::get_no_tokens</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">Phrases::TypeData::get_no_tokens</span></span>:<br/>Invocations - <a href="6-inv.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::get_no_tokens</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">Phrases::TypeData::get_no_tokens</span></span>:<br/>Invocations - <a href="6-inv.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_tokens</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -477,11 +477,11 @@ in the next.
</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">Phrases::TypeData::deprecated</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">Phrases::TypeData::deprecated</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP6_6">&#167;6.6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::deprecated</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">Phrases::TypeData::deprecated</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP6_6">&#167;6.6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">now_deprecated</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">Phrases::TypeData::deprecate_phrase</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">Phrases::TypeData::deprecate_phrase</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::deprecate_phrase</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">Phrases::TypeData::deprecate_phrase</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">now_deprecated</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -528,7 +528,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">Phrases::TypeData::into_stack_frame</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">Phrases::TypeData::into_stack_frame</span></span>:<br/>Phrases - <a href="3-phr.html#SP7">&#167;7</a><br/>Compile Phrases - <a href="6-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">Phrases::TypeData::into_stack_frame</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">Phrases::TypeData::into_stack_frame</span></span>:<br/>Phrases - <a href="3-phr.html#SP5">&#167;5</a><br/>Compile Phrases - <a href="6-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">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</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>
@ -738,7 +738,7 @@ variable" is more specific than "new variable", which isn't helpful.
<span class="definition-keyword">define</span> <span class="constant-syntax">THE_PRIMORDIAL_SAY_PHRASE</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">say_details</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::new_say_details</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">Phrases::TypeData::new_say_details</span></span>:<br/><a href="3-ptd.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">say_details</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::new_say_details</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">Phrases::TypeData::new_say_details</span></span>:<br/><a href="3-ptd.html#SP9">&#167;9</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">say_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">sd</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sd</span><span class="plain-syntax">.</span><span class="element-syntax">say_phrase</span><span class="plain-syntax"> = </span><span class="constant-syntax">NOT_A_SAY_PHRASE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sd</span><span class="plain-syntax">.</span><span class="element-syntax">say_phrase_running_on</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -751,7 +751,7 @@ variable" is more specific than "new variable", which isn't helpful.
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">first_say_made</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">Phrases::TypeData::make_sd</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">Phrases::TypeData::make_sd</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP17_2">&#167;17.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">say_details</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ro</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cs</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cat</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::make_sd</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">Phrases::TypeData::make_sd</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP17_2">&#167;17.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">say_details</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ro</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cs</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cat</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">say_phrase</span><span class="plain-syntax"> = </span><span class="constant-syntax">A_MISCELLANEOUS_SAY_PHRASE</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">first_say_made</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">sd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">say_phrase</span><span class="plain-syntax"> = </span><span class="constant-syntax">THE_PRIMORDIAL_SAY_PHRASE</span><span class="plain-syntax">;</span>
@ -764,7 +764,7 @@ variable" is more specific than "new variable", which isn't helpful.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">cat</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">sd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">say_phrase_stream_closing_token_at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cat</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">Phrases::TypeData::log_say_details</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">Phrases::TypeData::log_say_details</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">say_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">sd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::log_say_details</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">Phrases::TypeData::log_say_details</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">say_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">sd</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">sd</span><span class="plain-syntax">.</span><span class="element-syntax">say_phrase</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">NOT_A_SAY_PHRASE:</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">A_MISCELLANEOUS_SAY_PHRASE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" A_MISCELLANEOUS_SAY_PHRASE\n"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
@ -783,8 +783,8 @@ variable" is more specific than "new variable", which isn't helpful.
<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">Phrases::TypeData::is_a_say_phrase</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">Phrases::TypeData::is_a_say_phrase</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP6_5">&#167;6.5</a><br/>Invocations - <a href="6-inv.html#SP21">&#167;21</a><br/>Parse Invocations - <a href="6-pi.html#SP2">&#167;2</a><br/>Compile Phrases - <a href="6-cp.html#SP4_2_1">&#167;4.2.1</a>, <a href="6-cp.html#SP5">&#167;5</a>, <a href="6-cp.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_say</span><span class="plain-syntax">.</span><span class="element-syntax">say_phrase</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">Phrases::TypeData::is_a_say_phrase</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">Phrases::TypeData::is_a_say_phrase</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP6_5">&#167;6.5</a><br/>Invocations - <a href="6-inv.html#SP21">&#167;21</a><br/>Parse Invocations - <a href="6-pi.html#SP2">&#167;2</a><br/>Compile Phrases - <a href="6-cp.html#SP4_2_1">&#167;4.2.1</a>, <a href="6-cp.html#SP5">&#167;5</a>, <a href="6-cp.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_say</span><span class="plain-syntax">.</span><span class="element-syntax">say_phrase</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>
@ -810,7 +810,7 @@ variable" is more specific than "new variable", which isn't helpful.
<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">Phrases::TypeData::get_say_data</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">Phrases::TypeData::get_say_data</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">say_details</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sd</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::get_say_data</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">Phrases::TypeData::get_say_data</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">say_details</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sd</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">say_cs</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ssp_tok</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ssp_ctok</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ssp_pos</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">say_cs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">sd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">say_control_structure</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">ssp_tok</span><span class="plain-syntax"> = </span><span class="identifier-syntax">sd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">say_phrase_stream_token_at</span><span class="plain-syntax">;</span>
@ -818,7 +818,7 @@ variable" is more specific than "new variable", which isn't helpful.
<span class="plain-syntax"> *</span><span class="identifier-syntax">ssp_pos</span><span class="plain-syntax"> = </span><span class="identifier-syntax">sd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">say_phrase_stream_position</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">Phrases::TypeData::preface_for_say_HTML</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">Phrases::TypeData::preface_for_say_HTML</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">say_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">sd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">paste_format</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::preface_for_say_HTML</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">Phrases::TypeData::preface_for_say_HTML</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">say_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">sd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">paste_format</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">sd</span><span class="plain-syntax">.</span><span class="identifier-syntax">say_phrase</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">sd</span><span class="plain-syntax">.</span><span class="element-syntax">say_phrase</span><span class="plain-syntax"> != </span><span class="constant-syntax">THE_PRIMORDIAL_SAY_PHRASE</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">paste_format</span><span class="plain-syntax">) {</span>
@ -836,7 +836,7 @@ variable" is more specific than "new variable", which isn't helpful.
<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">Phrases::TypeData::epilogue_for_say_HTML</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">Phrases::TypeData::epilogue_for_say_HTML</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">say_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">sd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">paste_format</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::epilogue_for_say_HTML</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">Phrases::TypeData::epilogue_for_say_HTML</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">say_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">sd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">paste_format</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">sd</span><span class="plain-syntax">.</span><span class="identifier-syntax">say_phrase</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">sd</span><span class="plain-syntax">.</span><span class="element-syntax">say_phrase</span><span class="plain-syntax"> != </span><span class="constant-syntax">THE_PRIMORDIAL_SAY_PHRASE</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">paste_format</span><span class="plain-syntax"> == </span><span class="constant-syntax">PASTE_PHRASE_FORMAT</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>
@ -847,7 +847,7 @@ variable" is more specific than "new variable", which isn't helpful.
<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">Phrases::TypeData::ssp_matches</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Phrases::TypeData::ssp_matches</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ssp_tok</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">list_pos</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::ssp_matches</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">Phrases::TypeData::ssp_matches</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ssp_tok</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">list_pos</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">this_tok</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_say</span><span class="plain-syntax">.</span><span class="element-syntax">say_phrase_stream_token_at</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">this_pos</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_say</span><span class="plain-syntax">.</span><span class="element-syntax">say_phrase_stream_position</span><span class="plain-syntax">;</span>
@ -869,7 +869,7 @@ by than name.
<span class="definition-keyword">define</span> <span class="constant-syntax">LOOP_BODY_BLOCK_FOLLOWS</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">inline_details</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::new_inline_details</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">Phrases::TypeData::new_inline_details</span></span>:<br/><a href="3-ptd.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">inline_details</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::new_inline_details</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Phrases::TypeData::new_inline_details</span></span>:<br/><a href="3-ptd.html#SP9">&#167;9</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">inline_details</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">.</span><span class="element-syntax">invoked_inline_not_as_call</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -888,7 +888,7 @@ by than name.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_lets_made</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">Phrases::TypeData::make_id</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">Phrases::TypeData::make_id</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inline_details</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="identifier-syntax">op</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">assgn</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">let</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">blk</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">only_in</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::make_id</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">Phrases::TypeData::make_id</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inline_details</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="identifier-syntax">op</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">assgn</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">let</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">blk</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">only_in</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">arithmetical_operation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">op</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">assignment_phrase</span><span class="plain-syntax"> = </span><span class="identifier-syntax">assgn</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">let</span><span class="plain-syntax"> == </span><span class="constant-syntax">ASSIGNMENT_LET_PHRASE</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">no_lets_made</span><span class="plain-syntax">++ &gt;= </span><span class="constant-syntax">3</span><span class="plain-syntax">)) </span><span class="identifier-syntax">let</span><span class="plain-syntax"> = </span><span class="constant-syntax">NOT_A_LET_PHRASE</span><span class="plain-syntax">;</span>
@ -901,7 +901,7 @@ by than name.
<p class="commentary firstcommentary"><a id="SP24" class="paragraph-anchor"></a><b>&#167;24. </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">Phrases::TypeData::log_inline_details</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">Phrases::TypeData::log_inline_details</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inline_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::log_inline_details</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">Phrases::TypeData::log_inline_details</span></span>:<br/>Describing Phrase Type Data - <a href="3-dptd.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inline_details</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">id</span><span class="plain-syntax">.</span><span class="identifier-syntax">block_follows</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" block follows\n"</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">id</span><span class="plain-syntax">.</span><span class="identifier-syntax">let_phrase</span><span class="plain-syntax"> != </span><span class="constant-syntax">NOT_A_LET_PHRASE</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" let phrase (%d)\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</span><span class="plain-syntax">.</span><span class="element-syntax">let_phrase</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">id</span><span class="plain-syntax">.</span><span class="identifier-syntax">only_in_loop</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" may only be used in a %w body\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</span><span class="plain-syntax">.</span><span class="element-syntax">only_in_loop</span><span class="plain-syntax">);</span>
@ -914,48 +914,48 @@ by than name.
<p class="commentary firstcommentary"><a id="SP25" class="paragraph-anchor"></a><b>&#167;25. </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">Phrases::TypeData::make_inline</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">Phrases::TypeData::make_inline</span></span>:<br/>Phrases - <a href="3-phr.html#SP4_3">&#167;4.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::make_inline</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">invoked_inline_not_as_call</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">Phrases::TypeData::invoked_inline</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">Phrases::TypeData::invoked_inline</span></span>:<br/>Compile Invocations - <a href="6-ci.html#SP2_1_1_1">&#167;2.1.1.1</a>, <a href="6-ci.html#SP3_1">&#167;3.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">invoked_inline_not_as_call</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::invoked_inline</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">Phrases::TypeData::invoked_inline</span></span>:<br/>Compile Invocations - <a href="6-ci.html#SP2_1_1_1">&#167;2.1.1.1</a>, <a href="6-ci.html#SP3_1">&#167;3.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">invoked_inline_not_as_call</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP26" class="paragraph-anchor"></a><b>&#167;26. </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">Phrases::TypeData::is_a_let_assignment</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">let_phrase</span><span class="plain-syntax"> == </span><span class="constant-syntax">ASSIGNMENT_LET_PHRASE</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">Phrases::TypeData::is_a_let_assignment</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">let_phrase</span><span class="plain-syntax"> == </span><span class="constant-syntax">ASSIGNMENT_LET_PHRASE</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">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::is_a_let_equation</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">Phrases::TypeData::is_a_let_equation</span></span>:<br/>Parse Invocations - <a href="6-pi.html#SP5_2">&#167;5.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">let_phrase</span><span class="plain-syntax"> == </span><span class="constant-syntax">EQUATION_LET_PHRASE</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">Phrases::TypeData::is_a_let_equation</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">Phrases::TypeData::is_a_let_equation</span></span>:<br/>Parse Invocations - <a href="6-pi.html#SP5_2">&#167;5.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">let_phrase</span><span class="plain-syntax"> == </span><span class="constant-syntax">EQUATION_LET_PHRASE</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">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::arithmetic_operation</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">Phrases::TypeData::arithmetic_operation</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP3_5_7">&#167;3.5.7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">arithmetical_operation</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::arithmetic_operation</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">Phrases::TypeData::arithmetic_operation</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP3_5_7">&#167;3.5.7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">arithmetical_operation</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">Phrases::TypeData::is_arithmetic_phrase</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::is_arithmetic_phrase</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="3-ptd.html#SP26" class="function-link"><span class="function-syntax">Phrases::TypeData::arithmetic_operation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="3-ptd.html#SP26" class="function-link"><span class="function-syntax">Phrases::TypeData::arithmetic_operation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) &lt; </span><span class="identifier-syntax">NO_OPERATIONS</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">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::is_assignment_phrase</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">assignment_phrase</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::is_assignment_phrase</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">assignment_phrase</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::TypeData::only_in</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">only_in_loop</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::TypeData::only_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">only_in_loop</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">Phrases::TypeData::block_follows</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">Phrases::TypeData::block_follows</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP1">&#167;1</a>, <a href="6-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="6-cii.html#SP3_5_1_1">&#167;3.5.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">block_follows</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::block_follows</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">Phrases::TypeData::block_follows</span></span>:<br/>Compile Invocations Inline - <a href="6-cii.html#SP1">&#167;1</a>, <a href="6-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="6-cii.html#SP3_5_1_1">&#167;3.5.1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">block_follows</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP27" class="paragraph-anchor"></a><b>&#167;27. Return value polymorphism. </b>Inform has two sorts of polymorphism &mdash; that is, there are two ways in which
@ -981,7 +981,7 @@ source text.
</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">Phrases::TypeData::inline_type_data_comparison</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">Phrases::TypeData::inline_type_data_comparison</span></span>:<br/><a href="3-ptd.html#SP20_1">&#167;20.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd1</span><span class="plain-syntax">, </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd2</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::TypeData::inline_type_data_comparison</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">Phrases::TypeData::inline_type_data_comparison</span></span>:<br/><a href="3-ptd.html#SP20_1">&#167;20.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd1</span><span class="plain-syntax">, </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd2</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">phtd1</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">only_in_loop</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">phtd2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">only_in_loop</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">BEFORE_PH</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">phtd2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">only_in_loop</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">phtd1</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_inline</span><span class="plain-syntax">.</span><span class="element-syntax">only_in_loop</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>

View file

@ -148,7 +148,7 @@ marks it as deallocated.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure local_variable is accessed in 2/rlb, 2/act, 3/phr, 3/prcd, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li></ul>
<ul class="endnotetexts"><li>The structure local_variable is accessed in 2/rlb, 2/act, 3/prcd, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>A local variable needs to be stored somewhere at run-time. The obvious
correspondence is to put these into I6 local variables, which are, in effect,
CPU registers. We won't need to do much in the way of register-allocation,
@ -456,7 +456,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><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">LocalVariables::options_parameter_is_needed</span></span>:<br/>Phrases - <a href="3-phr.html#SP7">&#167;7</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::options_parameter_is_needed</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">LocalVariables::options_parameter_is_needed</span></span>:<br/>Phrases - <a href="3-phr.html#SP5">&#167;5</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><a href="4-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>

View file

@ -129,7 +129,7 @@ for which memory allocation and deallocation will be 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="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="4-sf.html#SP5">&#167;5</a><br/>Phrases - <a href="3-phr.html#SP4_4">&#167;4.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</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</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="4-sf.html#SP5">&#167;5</a><br/>Phrases - <a href="3-phr.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">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="4-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>

View file

@ -107,7 +107,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">stacked_variable_owner_list</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure stacked_variable is accessed in 2/rls, 2/fao, 2/act, 3/po, 6/cii, 6/cste and here.</li><li>The structure stacked_variable_list is accessed in 2/rlb, 2/act, 3/phr, 3/prcd, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li><li>The structure stacked_variable_owner is private to this section.</li><li>The structure stacked_variable_owner_list is accessed in 2/rlb, 2/act, 3/phr, 3/prcd, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li></ul>
<ul class="endnotetexts"><li>The structure stacked_variable is accessed in 2/rls, 2/fao, 2/act, 3/po, 6/cii, 6/cste and here.</li><li>The structure stacked_variable_list is accessed in 2/rlb, 2/act, 3/prcd, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li><li>The structure stacked_variable_owner is private to this section.</li><li>The structure stacked_variable_owner_list is accessed in 2/rlb, 2/act, 3/prcd, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<pre class="displayed-code all-displayed-code code-font">

View file

@ -158,7 +158,7 @@ earlier invocation list (in what may be another setting entirely).
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</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">tokens_packet</span><span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-ci.html#SP2_1_1_1" class="named-paragraph-link"><span class="named-paragraph">First construct an arguments packet</span><span class="named-paragraph-number">2.1.1.1</span></a></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">VH2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Holsters::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">vhmode_wanted</span><span class="plain-syntax">);</span>
@ -177,19 +177,19 @@ earlier invocation list (in what may be another setting entirely).
<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;</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">.</span><span class="element-syntax">tokens_count</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax"> = </span><a href="6-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_token_as_parsed</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</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">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="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="3-ptd.html#SP25" class="function-link"><span class="function-syntax">Phrases::TypeData::invoked_inline</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</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::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="identifier-syntax">tokens</span><span class="plain-syntax">.</span><span class="element-syntax">kind_required</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</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">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">.</span><span class="element-syntax">kind_required</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">construct</span><span class="plain-syntax"> == </span><span class="constant-syntax">KIND_NAME_PT_CONSTRUCT</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">construct</span><span class="plain-syntax"> == </span><span class="constant-syntax">KIND_NAME_PT_CONSTRUCT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">.</span><span class="element-syntax">args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">Rvalues::new_nothing_object_constant</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">tokens</span><span class="plain-syntax">.</span><span class="element-syntax">args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">val</span><span class="plain-syntax">;</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">return_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_kind_resulting</span><span class="plain-syntax">(</span><a href="6-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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">return_kind</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">)) </span><span class="identifier-syntax">return_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">return_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">return_kind</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">)) </span><span class="identifier-syntax">return_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">return_kind</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">.</span><span class="identifier-syntax">as_requested</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::function_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">.</span><span class="element-syntax">tokens_count</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">.</span><span class="element-syntax">kind_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">return_kind</span><span class="plain-syntax">);</span>
</pre>
@ -208,7 +208,7 @@ earlier invocation list (in what may be another setting entirely).
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">manner_expected</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">manner_of_return</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">manner_expected</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">manner_of_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">returned_in_manner</span><span class="plain-syntax"> != </span><span class="identifier-syntax">manner_expected</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">manner_expected</span><span class="plain-syntax"> != </span><span class="constant-syntax">DECIDES_NOTHING_AND_RETURNS_MOR</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">"C%d: $e: returned in manner %d\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">returned_in_manner</span><span class="plain-syntax">);</span>
@ -219,7 +219,7 @@ earlier invocation list (in what may be another setting entirely).
<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">Problems::quote_text</span><span class="plain-syntax">(3,</span>
<span class="plain-syntax"> </span><a href="3-ptd.html#SP11" class="function-link"><span class="function-syntax">Phrases::TypeData::describe_manner_of_return</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">manner_expected</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">), &amp;</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</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="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) </span><span class="identifier-syntax">Problems::quote_kind</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_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_WrongEndToPhrase</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>
@ -250,13 +250,13 @@ will be expressions being evaluated.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><a href="6-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="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><a href="6-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="6-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_no_tokens</span></a><span class="plain-syntax">(</span><a href="6-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="4-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><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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">manner_of_return</span><span class="plain-syntax"> == </span><span class="constant-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>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">manner_of_return</span><span class="plain-syntax"> == </span><span class="constant-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>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-ci.html#SP2_2_3" class="named-paragraph-link"><span class="named-paragraph">Compile the resolution</span><span class="named-paragraph-number">2.2.3</span></a></span><span class="plain-syntax">;</span>
</pre>
@ -416,7 +416,7 @@ at run-time; we assign 0 to it for the sake of tidiness.
<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_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">RTTemporaryVariables::iname_of_formal_parameter</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">construct</span><span class="plain-syntax"> == </span><span class="constant-syntax">KIND_NAME_PT_CONSTRUCT</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">construct</span><span class="plain-syntax"> == </span><span class="constant-syntax">KIND_NAME_PT_CONSTRUCT</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">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="constant-syntax">BEGIN_COMPILATION_MODE</span><span class="plain-syntax">;</span>
@ -424,7 +424,7 @@ at run-time; we assign 0 to it for the sake of tidiness.
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="6-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_token_as_parsed</span></a><span class="plain-syntax">(</span><a href="6-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="identifier-syntax">i</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">to_be_used_as</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">to_match</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-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">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_be_used_as</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="constant-syntax">END_COMPILATION_MODE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -547,7 +547,7 @@ no subsequent lines are looked at.
<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">Node::get_say_adjective</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTAdjectives::emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_say_adjective</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">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</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">tokens_packet</span><span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-ci.html#SP2_1_1_1" class="named-paragraph-link"><span class="named-paragraph">First construct an arguments packet</span><span class="named-paragraph-number">2.1.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-ci.html#SP2_2_3_3_1_1" class="named-paragraph-link"><span class="named-paragraph">Substitute the formal parameter variables into the tokens</span><span class="named-paragraph-number">2.2.3.3.1.1</span></a></span><span class="plain-syntax">;</span>
@ -568,7 +568,7 @@ no subsequent lines are looked at.
<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">Node::get_say_adjective</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTAdjectives::emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_say_adjective</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">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</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">tokens_packet</span><span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-ci.html#SP2_1_1_1" class="named-paragraph-link"><span class="named-paragraph">First construct an arguments packet</span><span class="named-paragraph-number">2.1.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-ci.html#SP2_2_3_3_1_1" class="named-paragraph-link"><span class="named-paragraph">Substitute the formal parameter variables into the tokens</span><span class="named-paragraph-number">2.2.3.3.1.1</span></a></span><span class="plain-syntax">;</span>
@ -779,7 +779,7 @@ we need to ensure there are round brackets around.
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">MATCHING</span><span class="plain-syntax">, </span><span class="string-syntax">"Compiling single invocation: $e\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="constant-syntax">BEGIN_COMPILATION_MODE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">manner_of_return</span><span class="plain-syntax"> = </span><span class="constant-syntax">DONT_KNOW_MOR</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-ci.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">The art of invocation is delegation</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>

View file

@ -78,7 +78,7 @@ function togglePopup(material_id) {
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::AsCalls::csi_by_call</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">Invocations::AsCalls::csi_by_call</span></span>:<br/>Compile Invocations - <a href="6-ci.html#SP3_1">&#167;3.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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">source_location</span><span class="plain-syntax"> *</span><span class="identifier-syntax">where_from</span><span class="plain-syntax">, </span><span class="reserved-syntax">tokens_packet</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</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">IS</span><span class="plain-syntax"> = </span><a href="6-cp.html#SP3" class="function-link"><span class="function-syntax">Routines::Compile::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PhraseRequests::make_request</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_requested</span><span class="plain-syntax">,</span>

View file

@ -111,7 +111,7 @@ Standard Rules. They may change without warning.
<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">csi_state</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">source_location</span><span class="plain-syntax"> *</span><span class="identifier-syntax">where_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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">inv</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">tokens_packet</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tokens</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">local_variable</span><span class="plain-syntax"> **</span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">;</span>
@ -120,7 +120,7 @@ Standard Rules. They may change without warning.
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::Inline::csi_inline_outer</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">Invocations::Inline::csi_inline_outer</span></span>:<br/>Compile Invocations - <a href="6-ci.html#SP3_1">&#167;3.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="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">source_location</span><span class="plain-syntax"> *</span><span class="identifier-syntax">where_from</span><span class="plain-syntax">, </span><span class="reserved-syntax">tokens_packet</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</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">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">[10]; </span><span class="comment-syntax"> the "my" variables 0 to 9</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-cii.html#SP1_1" class="named-paragraph-link"><span class="named-paragraph">Start with all of the implicit my-variables unused</span><span class="named-paragraph-number">1.1</span></a></span><span class="plain-syntax">;</span>
@ -140,7 +140,7 @@ Standard Rules. They may change without warning.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-ptd.html#SP26" class="function-link"><span class="function-syntax">Phrases::TypeData::block_follows</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-cii.html#SP1_4" class="named-paragraph-link"><span class="named-paragraph">Open a code block</span><span class="named-paragraph-number">1.4</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-cii.html#SP1_5" class="named-paragraph-link"><span class="named-paragraph">Release any variables created inline</span><span class="named-paragraph-number">1.5</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inline_mor</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">inline_mor</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure csi_state is private to this section.</li></ul>
@ -210,8 +210,8 @@ head goes to <span class="extract"><span class="extract-syntax">OUT</span></span
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><a href="6-cii.html#SP2" class="function-link"><span class="function-syntax">Invocations::Inline::csi_inline_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::get_inter_head</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">), &amp;</span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::get_inter_tail</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">)) </span><span class="identifier-syntax">tail_schema</span><span class="plain-syntax"> = </span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::get_inter_tail</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-cii.html#SP2" class="function-link"><span class="function-syntax">Invocations::Inline::csi_inline_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::get_inter_head</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">), &amp;</span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::get_inter_tail</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">)) </span><span class="identifier-syntax">tail_schema</span><span class="plain-syntax"> = </span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::get_inter_tail</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-cii.html#SP1">&#167;1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP1_4" class="paragraph-anchor"></a><b>&#167;1.4. </b>Suppose there's a phrase with both head and tail. Then the tail won't appear
@ -270,7 +270,7 @@ or with a fragment of Inform 7 source text inside <span class="extract"><span cl
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_schema_token</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sche</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CSIS_s</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">prim_cat</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">csi_state</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CSIS</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">csi_state</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">CSIS_s</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ph</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ph</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">inv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">tokens_packet</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tokens</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tokens</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">my_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_vars</span><span class="plain-syntax">;</span>
@ -326,7 +326,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="4-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">ph_being_parsed</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-element-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="4-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">ph_being_parsed</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-element-syntax">compilation_data</span><span class="Preform-plain-syntax">.</span><span class="Preform-element-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">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>
@ -366,7 +366,7 @@ charlatans" and what they "deserve". I'm a better person now.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ph</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;inline-substitution&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">BRW</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">current_opts</span><span class="plain-syntax"> = </span><a href="6-inv.html#SP20" class="function-link"><span class="function-syntax">Invocations::get_phrase_options_bitmap</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
@ -409,7 +409,7 @@ the presence of annotations can change what we do.
<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="4-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="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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">tok</span><span class="plain-syntax">].</span><span class="element-syntax">token_kind</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">tok</span><span class="plain-syntax">].</span><span class="element-syntax">token_kind</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="6-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="6-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>
@ -1060,7 +1060,7 @@ the problem messages are phrased differently if something goes wrong.
<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="4-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">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><a href="3-ptd.html#SP10" class="function-link"><span class="function-syntax">Phrases::TypeData::get_mor</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</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><a href="3-ptd.html#SP10" class="function-link"><span class="function-syntax">Phrases::TypeData::get_mor</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">phrase_being_compiled</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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">allow_me</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ALWAYS_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">kind_needed</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_nil</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &amp;&amp;</span>
@ -2132,14 +2132,14 @@ then the operand refers to its value in the current invocation;
</li><li>(c) and failing that we have the name of a local I6 variable.
</li></ul>
<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">Invocations::Inline::parse_bracing_operand_as_identifier</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">Invocations::Inline::parse_bracing_operand_as_identifier</span></span>:<br/><a href="6-cii.html#SP3_5_2">&#167;3.5.2</a>, <a href="6-cii.html#SP3_5_3">&#167;3.5.3</a>, <a href="6-cii.html#SP3_5_4_1">&#167;3.5.4.1</a>, <a href="6-cii.html#SP3_5_5">&#167;3.5.5</a>, <a href="6-cii.html#SP3_5_6">&#167;3.5.6</a>, <a href="6-cii.html#SP3_5_7_1">&#167;3.5.7.1</a>, <a href="6-cii.html#SP3_5_8">&#167;3.5.8</a>, <a href="6-cii.html#SP3_5_9">&#167;3.5.9</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="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">,</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</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">Invocations::Inline::parse_bracing_operand_as_identifier</span></span>:<br/><a href="6-cii.html#SP3_5_2">&#167;3.5.2</a>, <a href="6-cii.html#SP3_5_3">&#167;3.5.3</a>, <a href="6-cii.html#SP3_5_4_1">&#167;3.5.4.1</a>, <a href="6-cii.html#SP3_5_5">&#167;3.5.5</a>, <a href="6-cii.html#SP3_5_6">&#167;3.5.6</a>, <a href="6-cii.html#SP3_5_7_1">&#167;3.5.7.1</a>, <a href="6-cii.html#SP3_5_8">&#167;3.5.8</a>, <a href="6-cii.html#SP3_5_9">&#167;3.5.9</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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">tokens_packet</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> **</span><span class="identifier-syntax">my_vars</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="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">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</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">) &gt;= </span><span class="character-syntax">'0'</span><span class="plain-syntax">) &amp;&amp; (</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">) &lt;= </span><span class="character-syntax">'9'</span><span class="plain-syntax">))</span>
<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="4-lv.html#SP23" class="function-link"><span class="function-syntax">LocalVariables::parse</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-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="4-lv.html#SP23" class="function-link"><span class="function-syntax">LocalVariables::parse</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-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="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="4-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>

View file

@ -82,7 +82,7 @@ contain another, so there is never any need to recursively compile phrases.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> phrase whose definition is being compiled</span>
<span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> phrase whose definition is being compiled</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>This routine sits at the summit of a mountain of code: it compiles a
non-line phrase definition into a routine. Note once again that a single
@ -99,10 +99,10 @@ should always be supplied for "To..." phrases, but left null for rules.
</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::Compile::routine</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::Compile::routine</span></span>:<br/>Phrases - <a href="3-phr.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Routines::Compile::routine</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::Compile::routine</span></span>:<br/>Phrases - <a href="3-phr.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_owner_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">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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</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="element-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="element-syntax">next</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">PHRASE_COMPILATION</span><span class="plain-syntax">, </span><span class="string-syntax">"Compiling phrase:\n$T"</span><span class="plain-syntax">, </span><span class="identifier-syntax">code_at</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="6-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="6-cp.html#SP3" class="function-link"><span class="function-syntax">Routines::Compile::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-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="6-cp.html#SP3" class="function-link"><span class="function-syntax">Routines::Compile::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-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="named-paragraph-container code-font"><a href="6-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>
@ -128,15 +128,15 @@ should always be supplied for "To..." phrases, but left null for rules.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">PhraseRequests::comment_on_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">ImperativeDefinitions::write_comment_describing</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ImperativeDefinitions::write_comment_describing</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-cp.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>&#167;2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Set up the stack frame for this compilation request</span><span class="named-paragraph-number">2.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">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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</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"> = &amp;(</span><span class="identifier-syntax">ph</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">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</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="4-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><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>
@ -205,9 +205,9 @@ phrase to be different from the number version, and so on.
</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">Routines::Compile::iname</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::Compile::iname</span></span>:<br/><a href="6-cp.html#SP2">&#167;2</a><br/>Phrases - <a href="3-phr.html#SP12">&#167;12</a><br/>Compile Invocations As Calls - <a href="6-ciac.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Routines::Compile::iname</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::Compile::iname</span></span>:<br/><a href="6-cp.html#SP2">&#167;2</a><br/>Compile Invocations As Calls - <a href="6-ciac.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">req</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">req_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</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></p>
@ -290,7 +290,7 @@ phrase to be different from the number version, and so on.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Node::get_say_verb</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_say_adjective</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> ((</span><a href="3-ptd.html#SP21" class="function-link"><span class="function-syntax">Phrases::TypeData::is_a_say_phrase</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">))) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">)-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_say</span><span class="plain-syntax">.</span><span class="element-syntax">say_phrase_running_on</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">)-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_say</span><span class="plain-syntax">.</span><span class="element-syntax">say_phrase_running_on</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">prev_sn</span><span class="plain-syntax">, </span><span class="identifier-syntax">suppress_newlines_ANNOT</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>
@ -429,7 +429,7 @@ henceforth to be true, so we simply compile empty code in that case.
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">to_compile</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">named_rulebook_outcome</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nrbo</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="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrase_being_compiled</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">ImperativeDefinitionFamilies::goes_in_rulebooks</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</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">ImperativeDefinitionFamilies::goes_in_rulebooks</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</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">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_compile</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_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_MisplacedRulebookOutcome2</span><span class="plain-syntax">));</span>
@ -770,7 +770,7 @@ type-checks it, and finally, all being well, compiles it.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">inv</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="3-ptd.html#SP21" class="function-link"><span class="function-syntax">Phrases::TypeData::is_a_say_phrase</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">))) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">)-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_say</span><span class="plain-syntax">.</span><span class="element-syntax">say_control_structure</span><span class="plain-syntax"> == </span><span class="constant-syntax">NO_SAY_CS</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">)-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_say</span><span class="plain-syntax">.</span><span class="element-syntax">say_control_structure</span><span class="plain-syntax"> == </span><span class="constant-syntax">NO_SAY_CS</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">PARACONTENT_HL</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>
@ -883,11 +883,11 @@ the "[if...]".
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">invl</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">inv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_INVOCATION_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</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">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="3-ptd.html#SP21" class="function-link"><span class="function-syntax">Phrases::TypeData::is_a_say_phrase</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</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">say_cs</span><span class="plain-syntax">, </span><span class="identifier-syntax">ssp_tok</span><span class="plain-syntax">, </span><span class="identifier-syntax">ssp_ctok</span><span class="plain-syntax">, </span><span class="identifier-syntax">ssp_pos</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="3-ptd.html#SP21" class="function-link"><span class="function-syntax">Phrases::TypeData::get_say_data</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_say</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><a href="3-ptd.html#SP21" class="function-link"><span class="function-syntax">Phrases::TypeData::get_say_data</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">as_say</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> &amp;</span><span class="identifier-syntax">say_cs</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">ssp_tok</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">ssp_ctok</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">ssp_pos</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">ssp_pos</span><span class="plain-syntax"> == </span><span class="constant-syntax">SSP_START</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="6-cp.html#SP7_1_1" class="named-paragraph-link"><span class="named-paragraph">This starts a complex SSP</span><span class="named-paragraph-number">7.1.1</span></a></span><span class="plain-syntax">;</span>
@ -1175,10 +1175,10 @@ the "[if...]".
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Routines::Compile::add_scte_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ssp_tok</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">list_pos</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</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><a href="3-ptd.html#SP21" class="function-link"><span class="function-syntax">Phrases::TypeData::ssp_matches</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">ssp_tok</span><span class="plain-syntax">, </span><span class="identifier-syntax">list_pos</span><span class="plain-syntax">, &amp;</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="3-ptd.html#SP21" class="function-link"><span class="function-syntax">Phrases::TypeData::ssp_matches</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">ssp_tok</span><span class="plain-syntax">, </span><span class="identifier-syntax">list_pos</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(3, </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">ct</span><span class="plain-syntax">++ == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span><span class="string-syntax">"[%3]"</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">Problems::issue_problem_segment</span><span class="plain-syntax">(</span><span class="string-syntax">"/[%3]"</span><span class="plain-syntax">);</span>

View file

@ -341,7 +341,7 @@ casting between quasinumerical kinds, we'll have to return to this.)
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">RS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PhraseRequests::make_iname</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tok</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">leaf_symbol</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">function_notated</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-ptd.html#SP12" class="function-link"><span class="function-syntax">Phrases::TypeData::kind</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">tok</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">leaf_symbol</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">function_notated</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">tok</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">leaf_symbol</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">function_notated</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">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">RS</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"uncompilable equation node"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>

View file

@ -268,7 +268,7 @@ for different invocations of, say, "+".
<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">Node::get_say_adjective</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</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">"adj:%d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_say_adjective</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</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="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="3-phr.html#SP8" class="function-link"><span class="function-syntax">Phrases::log_briefly</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="3-phr.html#SP6" class="function-link"><span class="function-syntax">Phrases::log_briefly</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_phrase_invoked</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">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><a href="6-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_no_tokens</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</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">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" ($P"</span><span class="plain-syntax">, </span><a href="6-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_token_as_parsed</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</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><a href="6-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_token_check_to_do</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">))</span>
@ -471,7 +471,7 @@ variable-argument phrases like C's <span class="extract"><span class="extract-sy
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">inv</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 read NTI of null 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">Node::get_phrase_invoked</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">return</span><span class="plain-syntax"> </span><a href="3-ptd.html#SP15" class="function-link"><span class="function-syntax">Phrases::TypeData::get_no_tokens</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">)-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</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="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>
</pre>

View file

@ -109,8 +109,8 @@ phrase definition with the excerpt parser:
</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">Phrases::Parser::register_excerpt</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Parser::register_excerpt</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</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="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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">registration_text</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">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">PHRASE_REGISTRATION</span><span class="plain-syntax">, </span><span class="string-syntax">"Register phrase &lt;%W&gt; with type:\n$h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">registration_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">phtd</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">phtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">registration_text</span><span class="plain-syntax">;</span>
@ -133,10 +133,10 @@ the phrase under, and must make the actual registration.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">last_phrase_where_rp_problemed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Parser::register_phrasal</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">Phrases::Parser::register_phrasal</span></span>:<br/><a href="6-pi.html#SP2">&#167;2</a>, <a href="6-pi.html#SP3_2_1">&#167;3.2.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">phrase_mc</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">last_phrase_where_rp_problemed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Parser::register_phrasal</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">Phrases::Parser::register_phrasal</span></span>:<br/><a href="6-pi.html#SP2">&#167;2</a>, <a href="6-pi.html#SP3_2_1">&#167;3.2.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">phrase_mc</span><span class="plain-syntax">, </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">PHRASE_REGISTRATION</span><span class="plain-syntax">, </span><span class="string-syntax">"Register phrasal on &lt;%W&gt;: %u\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-ptd.html#SP12" class="function-link"><span class="function-syntax">Phrases::TypeData::kind</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><a href="3-ptd.html#SP12" class="function-link"><span class="function-syntax">Phrases::TypeData::kind</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">ph</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="named-paragraph-container code-font"><a href="6-pi.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Vet phrase text for suitability</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-pi.html#SP3_2" class="named-paragraph-link"><span class="named-paragraph">Look for slash-divided alternative phrasings and recurse to register all variations</span><span class="named-paragraph-number">3.2</span></a></span><span class="plain-syntax">;</span>
@ -387,7 +387,7 @@ yet vetted it, unless it's a fixed wording with nothing to check:
</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">Phrases::Parser::parse_against</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::Parser::parse_against</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">p</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">"parse against null subtree"</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">WW</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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">OW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
@ -399,7 +399,7 @@ yet vetted it, unless it's a fixed wording with nothing to check:
<span class="plain-syntax"> </span><span class="identifier-syntax">Node::set_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Dash::suspend_validation</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">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phtd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">ph</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="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">for</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;</span><span class="identifier-syntax">no_tokens</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="named-paragraph-container code-font"><a href="6-pi.html#SP4_2" class="named-paragraph-link"><span class="named-paragraph">Parse the ith token into the invocation</span><span class="named-paragraph-number">4.2</span></a></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">OW</span><span class="plain-syntax">)) </span><a href="6-inv.html#SP18" class="function-link"><span class="function-syntax">Invocations::set_phrase_options</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">OW</span><span class="plain-syntax">);</span>
@ -482,8 +482,8 @@ parser needs our help in the first place.)
<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="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">N</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to_match</span><span class="plain-syntax"> = </span><a href="6-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_token_to_be_parsed_against</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cons</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</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">ph</span><span class="plain-syntax">) </span><span class="identifier-syntax">cons</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">construct</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</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">ph</span><span class="plain-syntax">) </span><span class="identifier-syntax">cons</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">].</span><span class="element-syntax">construct</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">to_match</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">cons</span><span class="plain-syntax"> == </span><span class="constant-syntax">CONDITION_PT_CONSTRUCT</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">cons</span><span class="plain-syntax"> == </span><span class="constant-syntax">VOID_PT_CONSTRUCT</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">as_parsed</span><span class="plain-syntax"> = </span><a href="6-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_token_as_parsed</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">XW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">as_parsed</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

@ -91,7 +91,7 @@ an I6 routine name, but no: it compiles to a small array called a "closure".
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">cphr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">cphr_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">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ToPhraseFamily::body_of_constant</span><span class="plain-syntax">(</span><span class="identifier-syntax">cphr</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">ph</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">"cannot reconstruct phrase from cphr"</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">P</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::package_within</span></a><span class="plain-syntax">(</span><span class="constant-syntax">CLOSURES_HAP</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">requests_package</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">P</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::package_within</span></a><span class="plain-syntax">(</span><span class="constant-syntax">CLOSURES_HAP</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</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="identifier-syntax">cphr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">cphr_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">CLOSURE_DATA_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</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">cphr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">cphr_iname</span><span class="plain-syntax">;</span>

View file

@ -12,6 +12,14 @@
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
@ -115,7 +123,7 @@ is significant to the run-time list-printing code.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">list_together_routine</span><span class="plain-syntax"> *</span><span class="identifier-syntax">latest_ltr_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ListTogether::compilation_coroutine</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ListTogether::compilation_coroutine</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">ListTogether::compilation_coroutine</span></span>:<br/>Phrase Requests - <a href="4-pr.html#SP7">&#167;7</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">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="plain-syntax"> </span><span class="reserved-syntax">while</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">list_together_routine</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ltr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FIRST_OBJECT</span><span class="plain-syntax">(</span><span class="reserved-syntax">list_together_routine</span><span class="plain-syntax">);</span>

View file

@ -72,7 +72,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">runtime</a></li><li><a href="index.html#4">Chapter 4: Compilation Utilities</a></li><li><b>Phrase Requests</b></li></ul></div>
<p class="purpose">To store and later fill requests to compile To... phrases.</p>
<ul class="toc"><li><a href="4-pr.html#SP2">&#167;2. Logical priority of To phrases</a></li><li><a href="4-pr.html#SP3">&#167;3. Compilation requests</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-pr.html#SP2">&#167;2. Logical priority of To phrases</a></li><li><a href="4-pr.html#SP3">&#167;3. Compilation requests</a></li><li><a href="4-pr.html#SP9">&#167;9. Basic mode main</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>"To" phrases are compiled only when they are needed, and they can be
compiled in variant forms depending on the kinds of their arguments; so
@ -117,7 +117,7 @@ values in force, so that there is no possible ambiguity in how we read K.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">to_phrase_request</span><span class="plain-syntax"> *</span><span class="function-syntax">PhraseRequests::make_request</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">PhraseRequests::make_request</span></span>:<br/><a href="4-pr.html#SP4">&#167;4</a><br/>Phrases as Values - <a href="4-cls.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">to_phrase_request</span><span class="plain-syntax"> *</span><span class="function-syntax">PhraseRequests::make_request</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">PhraseRequests::make_request</span></span>:<br/><a href="4-pr.html#SP4">&#167;4</a>, <a href="4-pr.html#SP9">&#167;9</a><br/>Phrases as Values - <a href="4-cls.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</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">kind_variable_declaration</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kvd</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">ph</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</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">"bad request"</span><span class="plain-syntax">);</span>
@ -137,7 +137,7 @@ values in force, so that there is no possible ambiguity in how we read K.
<span class="plain-syntax"> </span><span class="identifier-syntax">compilation_unit</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cm</span><span class="plain-syntax"> = </span><a href="2-cu.html#SP6" class="function-link"><span class="function-syntax">CompilationUnits::current</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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</span><span class="plain-syntax">) </span><span class="identifier-syntax">cm</span><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">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</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">P</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::package_within</span></a><span class="plain-syntax">(</span><span class="constant-syntax">REQUESTS_HAP</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">requests_package</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">P</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::package_within</span></a><span class="plain-syntax">(</span><span class="constant-syntax">REQUESTS_HAP</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</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="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">req_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_localised_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">PHRASE_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">cm</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="plain-syntax">&lt;27; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_variables_interpretation</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>
@ -215,29 +215,7 @@ I6 routine.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Routines::Compile::iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</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 following coroutine compiles any pending requests for phrase compilation
since the last time it was called.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">to_phrase_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PhraseRequests::compilation_coroutine</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="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="plain-syntax"> </span><span class="reserved-syntax">while</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">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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">req</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FIRST_OBJECT</span><span class="plain-syntax">(</span><span class="reserved-syntax">to_phrase_request</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">req</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEXT_OBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax">, </span><span class="reserved-syntax">to_phrase_request</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">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">latest_request_granted</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">Phrases::compile</span><span class="plain-syntax">(</span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">requested_phrase</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">max_i</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">latest_request_granted</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">N</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">N</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. </b>In the course of doing this, <span class="extract"><span class="extract-syntax">Phrases::compile</span></span> calls us back to ask us
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>In the course of doing this, <span class="extract"><span class="extract-syntax">Phrases::compile</span></span> calls us back to ask us
to write a comment about this:
</p>
@ -253,7 +231,7 @@ to write a comment about this:
<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>It also needs access to:
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>It also needs access to:
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -267,6 +245,107 @@ to write a comment about this:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_variables_interpretation</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 twilight gathers, but our work is far from done. Recall that we have
accumulated compilation requests for "To..." phrases, but haven't actually
acted on them yet.
</p>
<p class="commentary">We have to do this in quite an open-ended way, because compiling one phrase
can easily generate fresh requests for others. For instance, suppose we have
the definition "To expose (X - a value)" in play, and suppose that when
compiling the phrase "To advertise", Inform runs into the line "expose the
hoarding text". This causes it to issue a compilation request for "To expose
(X - a text)". Perhaps we've compiled such a form already, but perhaps we
haven't. Compilation therefore goes on until all requests have been dealt
with.
</p>
<p class="commentary">Compiling phrases also produces the need for other pieces of code to be
generated &mdash; for example, suppose our phrase being compiled, "To advertise",
includes the text:
</p>
<blockquote>
<p>let Z be "Two for the price of one! Just [expose price]!";</p>
</blockquote>
<p class="commentary">We are going to need to compile "Two for the price of one! Just [expose price]!"
later on, in its own text substitution routine; but notice that it contains
the need for "To expose (X - a number)", and that will generate a further
phrase request.
</p>
<p class="commentary">Because of this and similar problems, it's impossible to compile all the
phrases alone: we must compile phrases, then things arising from them, then
phrases arising from those, then things arising from the phrases arising
from those, and so on, until we're done. The process is therefore structured
as a set of "coroutines" which each carry out as much as they can and then
hand over to the others to generate more work.
</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">PhraseRequests::compile_as_needed</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">repeat</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">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">repeat</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">repeat</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="4-pr.html#SP8" class="function-link"><span class="function-syntax">PhraseRequests::compilation_coroutine</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> &amp;</span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">total_phrases_to_compile</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">repeat</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><a href="4-lt.html#SP3" class="function-link"><span class="function-syntax">ListTogether::compilation_coroutine</span></a><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">repeat</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-los.html#SP2" class="function-link"><span class="function-syntax">LoopingOverScope::compilation_coroutine</span></a><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">repeat</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">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-ts.html#SP10" class="function-link"><span class="function-syntax">Strings::TextSubstitutions::compilation_coroutine</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">FALSE</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">repeat</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">Propositions::Deferred::compilation_coroutine</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">repeat</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>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>The following coroutine compiles any pending requests for phrase compilation
since the last time it was called.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">to_phrase_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PhraseRequests::compilation_coroutine</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">PhraseRequests::compilation_coroutine</span></span>:<br/><a href="4-pr.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">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="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="plain-syntax"> </span><span class="reserved-syntax">while</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">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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">req</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FIRST_OBJECT</span><span class="plain-syntax">(</span><span class="reserved-syntax">to_phrase_request</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">req</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEXT_OBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax">, </span><span class="reserved-syntax">to_phrase_request</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">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">latest_request_granted</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">Phrases::compile</span><span class="plain-syntax">(</span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">requested_phrase</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">max_i</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">latest_request_granted</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">N</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">N</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. Basic mode main. </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">PhraseRequests::invoke_to_begin</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">Task::begin_execution_af_to_begin</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">SUBMAIN_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">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">beginner</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ToPhraseFamily::to_begin</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">beginner</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">void_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::function_kind</span><span class="plain-syntax">(0, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_nil</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">IS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Routines::Compile::iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">beginner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="4-pr.html#SP3" class="function-link"><span class="function-syntax">PhraseRequests::make_request</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">beginner</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">void_kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">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">IS</span><span class="plain-syntax">);</span>
<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><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="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-rsft.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="progresssection"><a href="4-vrb.html">vrb</a></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="progresscurrent">pr</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-cls.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -110,7 +110,7 @@ function togglePopup(material_id) {
<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="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">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="identifier-syntax">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>
@ -118,7 +118,8 @@ function togglePopup(material_id) {
<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><a href="4-rls.html#SP2" class="function-link"><span class="function-syntax">RTRules::package</span></a><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">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">rfd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">constant_name</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::markup_wording</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="constant-syntax">RULE_NAME_HMD</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id</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">ph_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_localised_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RULE_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</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">owning_module</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id</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="identifier-syntax">ph_iname</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_localised_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RULE_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</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="identifier-syntax">owning_module</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="function-syntax">RTRules::package</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">RTRules::package</span></span>:<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">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>

View file

@ -77,7 +77,7 @@ function togglePopup(material_id) {
<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::prepare_for_requests</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">requests_package</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><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owning_module</span><span class="plain-syntax">, </span><span class="constant-syntax">PHRASES_HAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">requests_package</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><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">owning_module</span><span class="plain-syntax">, </span><span class="constant-syntax">PHRASES_HAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The code following is used throughout Inform, whenever we want to compile
@ -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/>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#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="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>
@ -148,7 +148,7 @@ 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/>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#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="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>

View file

@ -324,7 +324,7 @@ yet done, returning the number we compile.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">latest_ts_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Strings::TextSubstitutions::compilation_coroutine</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">Strings::TextSubstitutions::compilation_coroutine</span></span>:<br/><a href="4-ts.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">in_response_mode</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Strings::TextSubstitutions::compilation_coroutine</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">Strings::TextSubstitutions::compilation_coroutine</span></span>:<br/><a href="4-ts.html#SP12">&#167;12</a><br/>Phrase Requests - <a href="4-pr.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">in_response_mode</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="4-rsp.html#SP5" class="function-link"><span class="function-syntax">Strings::compile_response_launchers</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">N</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">compiling_text_routines_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>

View file

@ -100,7 +100,7 @@ function togglePopup(material_id) {
<span class="plain-syntax">}</span>
<span class="reserved-syntax">loop_over_scope</span><span class="plain-syntax"> *</span><span class="identifier-syntax">latest_los</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">LoopingOverScope::compilation_coroutine</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">LoopingOverScope::compilation_coroutine</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">LoopingOverScope::compilation_coroutine</span></span>:<br/>Phrase Requests - <a href="4-pr.html#SP7">&#167;7</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">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="plain-syntax"> </span><span class="reserved-syntax">while</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">loop_over_scope</span><span class="plain-syntax"> *</span><span class="identifier-syntax">los</span><span class="plain-syntax">;</span>

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
Total memory consumption was 260800K = 255 MB
62.8% was used for 1341250 objects, in 282990 frames in 205 x 800K = 164000K = 160 MB:
62.8% was used for 1341249 objects, in 282989 frames in 205 x 800K = 164000K = 160 MB:
9.7% inter_tree_node_array 36 x 8192 = 294912 objects, 25953408 bytes
5.4% text_stream_array 2583 x 100 = 258300 objects, 14547456 bytes
@ -72,10 +72,10 @@ Total memory consumption was 260800K = 255 MB
---- text_substitution 436 objects, 48832 bytes
---- cg_line 230 objects, 47840 bytes
---- table 7 objects, 45528 bytes
---- to_family_data 496 objects, 43648 bytes
---- inter_node_list 750 objects, 42000 bytes
---- activity_list_array 1 x 1000 objects, 40032 bytes
---- anl_clause_array 1 x 1000 objects, 40032 bytes
---- to_family_data 496 objects, 39680 bytes
---- response_message 407 objects, 35816 bytes
---- production_list 618 objects, 34608 bytes
---- regions_data 670 objects, 32160 bytes
@ -95,7 +95,7 @@ Total memory consumption was 260800K = 255 MB
---- property 146 objects, 18688 bytes
---- action_name 90 objects, 18000 bytes
---- parse_node_tree 20 objects, 17280 bytes
---- method 342 objects, 16416 bytes
---- method 341 objects, 16368 bytes
---- understanding_reference_array 2 x 100 = 200 objects, 16064 bytes
---- match_avinue_array 1 x 1000 objects, 16032 bytes
---- linked_list_item_array 1 x 1000 objects, 16032 bytes
@ -238,7 +238,7 @@ Total memory consumption was 260800K = 255 MB
37.1% was used for memory not allocated for objects:
15.7% text stream storage 42068764 bytes in 264534 claims
15.7% text stream storage 42068736 bytes in 264534 claims
3.4% dictionary storage 9278976 bytes in 16372 claims
---- sorting 992 bytes in 3 claims
2.6% source text 7200000 bytes in 3 claims
@ -254,5 +254,5 @@ Total memory consumption was 260800K = 255 MB
---- emitter array storage 12320 bytes in 8 claims
---- code generation workspace for objects 9200 bytes in 9 claims
20.5% was overhead - 54877136 bytes = 53590K = 52 MB
20.5% was overhead - 54881152 bytes = 53594K = 52 MB

View file

@ -3,9 +3,9 @@
(@1)<cardinal-number>=1
(hits 171/171) (matched: '100') constraint CS = {r0} extremes [1, 1]
(@1)minus (@2)<cardinal-number>=1
(hits 0/1891) constraint DS = {12} extremes [2, 2]
(hits 0/1894) constraint DS = {12} extremes [2, 2]
(@1)<quoted-text>=1 (@2)( (@3)<response-letter>=2 (@4))
(hits 273/762) (matched: '"[current item from the multiple object list]: [run paragraph on]" ( a )') constraint DS = {12} extremes [4, 4]
(hits 273/782) (matched: '"[current item from the multiple object list]: [run paragraph on]" ( a )') constraint DS = {12} extremes [4, 4]
(@1)<quoted-text>=1
(hits 1564/5543) (matched: 'Represents geographical locations, both indoor
and outdoor, which are not necessarily areas in a building. A player in one
@ -14,12 +14,12 @@
<s-literal-real-number>=1
(hits 11/9911) (matched: 'plus infinity') constraint (none) extremes [1, infinity)
(@1)<s-literal-truth-state>=1
(hits 78/979) (matched: 'false') constraint CS = {6} extremes [1, 1]
(hits 78/869) (matched: 'false') constraint CS = {6} extremes [1, 1]
<s-literal-list>=1
(hits 0/1594) constraint DS = {8} extremes [2, infinity)
(hits 0/1937) constraint DS = {8} extremes [2, infinity)
(@1)unicode <s-unicode-character>=1
(hits 0/4109) constraint DS = {12} extremes [2, infinity)
(hits 0/4160) constraint DS = {12} extremes [2, infinity)
<s-literal-time>=1
(hits 0/3052) constraint DW = {9, 10, 11} extremes [2, 5]
(hits 0/3044) constraint DW = {9, 10, 11} extremes [2, 5]
<s-literal-unit-notation>=1
(hits 0/9822) constraint (none) extremes [1, infinity)

View file

@ -1,27 +1,26 @@
100.0% in inform7 run
67.4% in compilation to Inter
26.0% in //ImperativeDefinitions::compile_first_block//
8.5% in //ImperativeDefinitions::compile_as_needed//
6.8% in //Strings::compile_responses//
6.1% in //InferenceSubjects::emit_all//
4.4% in //MajorNodes::pre_pass//
25.7% in //ImperativeDefinitions::compile_first_block//
8.8% in //PhraseRequests::compile_as_needed//
6.9% in //Strings::compile_responses//
6.0% in //InferenceSubjects::emit_all//
4.3% in //MajorNodes::pre_pass//
3.3% in //MajorNodes::pass_1//
2.0% in //RTRules::RulePrintingRule_routine//
1.8% in //RTRules::rulebooks_array_array//
1.6% in //ImperativeDefinitions::assess_all//
1.1% in //RTVerbs::ConjugateVerb//
0.9% in //RTVerbs::ConjugateVerb//
0.5% in //World::stage_V//
0.3% in //MajorNodes::pass_2//
0.3% in //RTRelations::compile_defined_relations//
0.3% in //RTRules::compile_rulebooks//
0.3% in //World::stage_V//
0.1% in //Emit::begin//
0.1% in //RTKinds::compile_data_type_support_routines//
0.1% in //Task::make_built_in_kind_constructors//
3.3% not specifically accounted for
30.1% in running Inter pipeline
10.0% in step preparation
9.8% in inter step 2/12: link
7.0% in inter step 12/12: generate inform6 -> auto.inf
0.1% in //RTRelations::compile_defined_relations//
0.1% in //World::stages_II_and_III//
3.7% not specifically accounted for
30.0% in running Inter pipeline
9.9% in step preparation
9.5% in inter step 2/12: link
6.9% 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
0.1% in inter step 11/12: eliminate-redundant-labels
@ -29,6 +28,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
1.7% not specifically accounted for
2.0% in supervisor
0.4% not specifically accounted for
2.0% not specifically accounted for
1.8% in supervisor
0.6% 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->stack_frame), CALLW, K);
LocalVariables::add_pronoun(&(body->compilation_data.stack_frame), CALLW, K);
}

View file

@ -110,7 +110,7 @@ VOID_METHOD_TYPE(TO_RCD_IMP_DEFN_MTID, imperative_defn_family *f, imperative_def
ph_runtime_context_data ImperativeDefinitionFamilies::to_phrcd(imperative_defn *id) {
current_sentence = id->at;
Frames::make_current(&(id->body_of_defn->stack_frame));
Frames::make_current(&(id->body_of_defn->compilation_data.stack_frame));
ph_runtime_context_data phrcd = Phrases::Context::new();
VOID_METHOD_CALL(id->family, TO_RCD_IMP_DEFN_MTID, id, &phrcd);
Frames::remove_current();
@ -194,22 +194,6 @@ void ImperativeDefinitionFamilies::compile(imperative_defn_family *f,
total_phrases_compiled, total_phrases_to_compile);
}
@ |COMPILE_AS_NEEDED_IMP_DEFN_MTID| is then called as an opportunity to
compile any remaining resources, and should pick up anything needed since the
last time it was called: note that it can be called multiple times.
@e COMPILE_AS_NEEDED_IMP_DEFN_MTID
=
VOID_METHOD_TYPE(COMPILE_AS_NEEDED_IMP_DEFN_MTID, imperative_defn_family *f,
int *total_phrases_compiled, int total_phrases_to_compile)
void ImperativeDefinitionFamilies::compile_as_needed(imperative_defn_family *f,
int *total_phrases_compiled, int total_phrases_to_compile) {
VOID_METHOD_CALL(f, COMPILE_AS_NEEDED_IMP_DEFN_MTID,
total_phrases_compiled, total_phrases_to_compile);
}
@ |PHRASEBOOK_INDEX_IMP_DEFN_MTID| should reply |TRUE| if the definition should
go into the Phrasebook page of the index.

View file

@ -2,7 +2,8 @@
Each IMPERATIVE node in the syntax tree makes a definition using imperative code.
@ Inform has several features -- most obviously rules and "To ..." phrases --
@h The head.
Inform has several features -- most obviously rules and "To ..." phrases --
where something is created with top-level syntax with a shape like so:
= (text as Inform 7)
Some preamble text ending in a colon:
@ -101,10 +102,10 @@ void ImperativeDefinitions::assess_all(void) {
"there doesn't seem to be any definition here",
"so I can't see what this rule or phrase would do.");
} else {
phrase *body = Phrases::create_from_preamble(id);
id->body_of_defn = body;
id->body_of_defn = ImperativeDefinitions::new_body(id);
ImperativeDefinitions::detect_inline(id);
ImperativeDefinitionFamilies::given_body(id);
Phrases::prepare_stack_frame(body);
Phrases::prepare_stack_frame(id->body_of_defn);
}
}
if (initial_problem_count < problem_count) return;
@ -131,8 +132,7 @@ void ImperativeDefinitions::assess_all(void) {
}
@ Whatever is defined probably wants to compile the body of the definition
into at least one (and perhaps more than one) Inter function. This is handled
in two stages. Stage one:
into at least one (and perhaps more than one) Inter function:
=
int total_phrases_to_compile = 0;
@ -154,17 +154,93 @@ void ImperativeDefinitions::compile_first_block(void) {
total_phrases_compiled = 0;
phrase *ph;
LOOP_OVER(ph, phrase)
if (ph->at_least_one_compiled_form_needed)
if (ph->compilation_data.at_least_one_compiled_form_needed)
total_phrases_to_compile++;
@ Stage two happens at least later, and may be repeated, so that it is
important not to do anything twice. This is intended as a final round-up of
any run-time resources which need to be made by the family.
@h The body.
=
void ImperativeDefinitions::compile_as_needed(void) {
imperative_defn_family *idf;
LOOP_OVER(idf, imperative_defn_family)
ImperativeDefinitionFamilies::compile_as_needed(idf,
&total_phrases_compiled, total_phrases_to_compile);
typedef struct phrase {
struct imperative_defn *from;
struct ph_type_data type_data;
struct ph_options_data options_data;
struct ph_runtime_context_data runtime_context_data;
struct ph_compilation_data compilation_data;
CLASS_DEFINITION
} phrase;
@ The life of a |phrase| structure begins when we look at the parse-tree
representation of its declaration in the source text.
A phrase is inline if and only if its definition consists of a single
invocation which is given as verbatim I6.
=
phrase *ImperativeDefinitions::new_body(imperative_defn *id) {
parse_node *p = id->at;
if ((p == NULL) || (Node::get_type(p) != IMPERATIVE_NT))
internal_error("a phrase preamble should be at a IMPERATIVE_NT node");
LOGIF(PHRASE_CREATIONS, "Creating phrase: <%W>\n", id->log_text);
phrase *body = CREATE(phrase);
body->from = id;
body->options_data = Phrases::Options::new(EMPTY_WORDING);
body->runtime_context_data = Phrases::Context::new();
body->type_data = Phrases::TypeData::new();
body->compilation_data = Phrases::new_compilation_data(id->at);
return body;
}
@ Inline definitions open with a raw Inform 6 inclusion. The lexer processes
those as two words: first |(-|, which serves as a marker, and then the raw
text of the inclusion treated as a single "word".
Some inline definitions also mark themselves to be included only in To phrases
of the right sort: it makes no sense to respond "yes" to a phrase "To decide
what number is...", for instance.
=
<inline-phrase-definition> ::=
(- ### - in to only | ==> { DECIDES_NOTHING_MOR, - }
(- ### - in to decide if only | ==> { DECIDES_CONDITION_MOR, - }
(- ### - in to decide only | ==> { DECIDES_VALUE_MOR, - }
(- ### | ==> { DONT_KNOW_MOR, - }
(- ### ... ==> @<Issue PM_TailAfterInline problem@>
@<Issue PM_TailAfterInline problem@> =
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TailAfterInline),
"some unexpected text appears after the tail of an inline definition",
"placed within '(-' and '-)' markers to indicate that it is written in "
"Inform 6. Here, there seems to be something extra after the '-)'.");
==> { fail nonterminal };
@ =
void ImperativeDefinitions::detect_inline(imperative_defn *id) {
parse_node *p = id->at;
int inline_wn = -1, mor = DONT_KNOW_MOR;
if ((p->down) && (p->down->down) && (p->down->down->next == NULL) &&
(<inline-phrase-definition>(Node::get_text(p->down->down)))) {
inline_wn = Wordings::first_wn(GET_RW(<inline-phrase-definition>, 1));
mor = <<r>>;
}
if (inline_wn >= 0) {
if (Wide::len(Lexer::word_text(inline_wn)) >= MAX_INLINE_DEFN_LENGTH)
@<Forbid overly long inline definitions@>;
if (ImperativeDefinitionFamilies::allows_inline(id) == FALSE)
@<Inline is for To... phrases only@>;
phrase *ph = id->body_of_defn;
Phrases::TypeData::make_inline(&(ph->type_data));
Phrases::make_inline(ph, inline_wn, mor);
}
}
@<Forbid overly long inline definitions@> =
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_InlineTooLong),
"the inline definition of this 'to...' phrase is too long",
"using a quantity of Inform 6 code which exceeds the fairly small limit "
"allowed. You will need either to write the phrase definition in Inform 7, "
"or to call an I6 routine which you define elsewhere with an 'Include ...'.");
@<Inline is for To... phrases only@> =
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_InlineRule),
"only 'to...' phrases can be given inline Inform 6 definitions",
"and in particular rules and adjective definitions can't.");

View file

@ -351,7 +351,7 @@ void RuleFamily::given_body(imperative_defn_family *self, imperative_defn *id) {
rfd->defines = R;
// if (rfd->not_in_rulebook == FALSE) Rules::request_automatic_placement(R);
id->body_of_defn->compile_with_run_time_debugging = TRUE;
id->body_of_defn->compilation_data.compile_with_run_time_debugging = TRUE;
Phrases::TypeData::set_mor(&(id->body_of_defn->type_data),
DECIDES_NOTHING_AND_RETURNS_MOR, NULL);
}

View file

@ -23,15 +23,19 @@ void ToPhraseFamily::create_family(void) {
METHOD_ADD(to_phrase_idf, GIVEN_BODY_IMP_DEFN_MTID, ToPhraseFamily::given_body);
METHOD_ADD(to_phrase_idf, ALLOWS_INLINE_IMP_DEFN_MTID, ToPhraseFamily::allows_inline);
METHOD_ADD(to_phrase_idf, COMPILE_IMP_DEFN_MTID, ToPhraseFamily::compile);
METHOD_ADD(to_phrase_idf, COMPILE_AS_NEEDED_IMP_DEFN_MTID, ToPhraseFamily::compile_as_needed);
METHOD_ADD(to_phrase_idf, PHRASEBOOK_INDEX_IMP_DEFN_MTID, ToPhraseFamily::include_in_Phrasebook_index);
}
@ Each To... phrase is given one of these:
@ Each To... preamble is parsed and given a //to_family_data// object. The
following slightly contrived example shows the resulting wordings; in practice
only the prototype is compulsory, and the other two are often empty.
= (text as Inform 7)
To double (N - a number) (documented at PHDOUBLE ) (this is doubling ):
<---- prototype -------> <- doc -> <- const name ->
=
=
typedef struct to_family_data {
struct wording pattern;
struct wording prototype_text;
struct wording constant_name;
struct wording ph_documentation_symbol; /* the documentation reference, if any */
@ -46,7 +50,6 @@ typedef struct to_family_data {
to_family_data *ToPhraseFamily::new_data(void) {
to_family_data *tfd = CREATE(to_family_data);
tfd->pattern = EMPTY_WORDING;
tfd->prototype_text = EMPTY_WORDING;
tfd->constant_name = EMPTY_WORDING;
tfd->ph_documentation_symbol = EMPTY_WORDING;
@ -164,29 +167,24 @@ To say (V - value) twice (this is double-saying): say "[V]. [V], I say!"
Problems::quote_wording(2, Nouns::nominative_singular(cphr->name));
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedGeneric));
Problems::issue_problem_segment(
"I can't allow %1, because the phrase it gives a name to "
"is generic, that is, it has a kind which is too vague. "
"That means there isn't any single phrase which '%2' "
"could refer to - there would have to be different versions "
"for every setting where it might be needed, and we can't "
"predict in advance which one '%2' might need to be.");
"I can't allow %1, because the phrase it gives a name to is generic, that is, "
"it has a kind which is too vague. That means there isn't any single phrase "
"which '%2' could refer to - there would have to be different versions "
"for every setting where it might be needed, and we can't predict in advance "
"which one '%2' might need to be.");
Problems::issue_problem_end();
}
tfd->as_constant = cphr;
@ The following routine takes a phrase and makes it officially a To
phrase, which in particular means adding it to the list of To phrases in
logical order. This essentially means that two lexically
indistinguishable phrases (e.g., "admire (OC - an open container)" and
"admire (C - a container)") are placed such that the more specific, in
type-checking terms, comes first (the open container case being the more
specific). The purpose of this list is to ensure that excerpt meanings
for phrase definitions are registered in logical priority order, because
the excerpt parser prefers earlier registrations to later ones in case
of ambiguity.
@ The following routine takes a phrase and makes it officially a To phrase,
which in particular means adding it to the list of To phrases in logical
order. This essentially means that two lexically indistinguishable phrases
(e.g., "admire (OC - an open container)" and "admire (C - a container)") are
placed such that the more specific, in type-checking terms, comes first (the
open container case being the more specific).
Note that the following sort algorithm affects only "to..." phrases,
and therefore has no effect on rule ordering within rulebooks.
This code affects only "To..." phrases, so it has no effect on rule ordering
within rulebooks. That's a similar issue, but addressed differently elsewhere.
=
imperative_defn *first_in_logical_order = NULL;
@ -269,10 +267,11 @@ int ToPhraseFamily::cmp(phrase *ph1, phrase *ph2) {
if (r == CONFLICTED_PH) {
Problems::quote_source(1, Phrases::declaration_node(ph1));
Problems::quote_source(2, Phrases::declaration_node(ph2));
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ConflictedReturnKinds));
StandardProblems::handmade_problem(Task::syntax_tree(),
_p_(PM_ConflictedReturnKinds));
Problems::issue_problem_segment(
"The two phrase definitions %1 and %2 make the same wording "
"produce two different kinds of value, which is not allowed.");
"The two phrase definitions %1 and %2 make the same wording produce two "
"different kinds of value, which is not allowed.");
Problems::issue_problem_end();
}
@ -294,6 +293,81 @@ void ToPhraseFamily::register(imperative_defn_family *self) {
}
}
@h Compilation.
We actually don't compile anything here: we just make "requests" to do so.
=
void ToPhraseFamily::compile(imperative_defn_family *self,
int *total_phrases_compiled, int total_phrases_to_compile) {
@<Mark To... phrases which have definite kinds for future compilation@>;
@<Throw problems for phrases with return kinds too vaguely defined@>;
@<Throw problems for inline phrases named as constants@>;
}
@<Mark To... phrases which have definite kinds for future compilation@> =
phrase *ph;
LOOP_OVER(ph, phrase) {
kind *K = Phrases::TypeData::kind(&(ph->type_data));
if (Kinds::Behaviour::definite(K))
if (ph->compilation_data.at_least_one_compiled_form_needed)
PhraseRequests::make_request(ph, K, NULL, EMPTY_WORDING);
}
@<Throw problems for phrases with return kinds too vaguely defined@> =
phrase *ph;
LOOP_OVER(ph, phrase) {
kind *KR = Phrases::TypeData::get_return_kind(&(ph->type_data));
if ((Kinds::Behaviour::semidefinite(KR) == FALSE) &&
(Phrases::TypeData::arithmetic_operation(ph) == -1)) {
current_sentence = Phrases::declaration_node(ph);
Problems::quote_source(1, current_sentence);
StandardProblems::handmade_problem(Task::syntax_tree(),
_p_(PM_ReturnKindVague));
Problems::issue_problem_segment(
"The declaration %1 tries to set up a phrase which decides a value which is "
"too vaguely described. For example, 'To decide which number is the target: "
"...' is fine, because 'number' is clear about what kind of value should "
"emerge; but 'To decide which value is the target: ...' is not clear enough.");
Problems::issue_problem_end();
}
for (int k=1; k<=26; k++)
if ((Kinds::Behaviour::involves_var(KR, k)) &&
(Phrases::TypeData::tokens_contain_variable(&(ph->type_data), k) == FALSE)) {
current_sentence = Phrases::declaration_node(ph);
TEMPORARY_TEXT(var_letter)
PUT_TO(var_letter, 'A'+k-1);
Problems::quote_source(1, current_sentence);
Problems::quote_stream(2, var_letter);
StandardProblems::handmade_problem(Task::syntax_tree(),
_p_(PM_ReturnKindUndetermined));
Problems::issue_problem_segment(
"The declaration %1 tries to set up a phrase which decides a value which "
"is too vaguely described, because it involves a kind variable (%2) which "
"it can't determine through usage.");
Problems::issue_problem_end();
DISCARD_TEXT(var_letter)
}
}
@<Throw problems for inline phrases named as constants@> =
phrase *ph;
LOOP_OVER(ph, phrase)
if ((Phrases::TypeData::invoked_inline(ph)) &&
(ToPhraseFamily::has_name_as_constant(ph->from))) {
current_sentence = Phrases::declaration_node(ph);
Problems::quote_source(1, current_sentence);
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedInline));
Problems::issue_problem_segment(
"The declaration %1 tries to give a name to a phrase which is defined using "
"inline Inform 6 code in (- markers -). Such phrases can't be named and used "
"as constants because they have no independent existence, being instead made "
"fresh each time they are used.");
Problems::issue_problem_end();
}
@h Access functions.
=
phrase *ToPhraseFamily::meaning_as_phrase(excerpt_meaning *em) {
if (em == NULL) return NULL;
return RETRIEVE_POINTER_phrase(em->data);
@ -374,145 +448,6 @@ wording ToPhraseFamily::doc_ref(imperative_defn *id) {
return tfd->ph_documentation_symbol;
}
@h Compilation.
=
void ToPhraseFamily::compile(imperative_defn_family *self,
int *total_phrases_compiled, int total_phrases_to_compile) {
@<Mark To... phrases which have definite kinds for future compilation@>;
@<Throw problems for phrases with return kinds too vaguely defined@>;
@<Throw problems for inline phrases named as constants@>;
}
@ As we'll see, it's legal in Inform to define "To..." phrases with vague
kinds: "To expose (X - a value)", for example. This can't be compiled as
vaguely as the definition implies, since there would be no way to know how
to store X. Instead, for each different kind of X which is actually needed,
a fresh version of the phrase is compiled -- one where X is a number, one
where it's a text, and so on. This is handled by making a "request" for the
phrase, indicating that a compiled version of it will be needed.
Since "To..." phrases are only compiled on request, we must remember to
request the boring ones with straightforward kinds ("To award (N - a number)
points", say). This is where we do it:
@<Mark To... phrases which have definite kinds for future compilation@> =
phrase *ph;
LOOP_OVER(ph, phrase) {
kind *K = Phrases::TypeData::kind(&(ph->type_data));
if (Kinds::Behaviour::definite(K)) {
if (ph->at_least_one_compiled_form_needed)
PhraseRequests::make_request(ph, K, NULL, EMPTY_WORDING);
}
}
@<Throw problems for phrases with return kinds too vaguely defined@> =
phrase *ph;
LOOP_OVER(ph, phrase) {
kind *KR = Phrases::TypeData::get_return_kind(&(ph->type_data));
if ((Kinds::Behaviour::semidefinite(KR) == FALSE) &&
(Phrases::TypeData::arithmetic_operation(ph) == -1)) {
current_sentence = Phrases::declaration_node(ph);
Problems::quote_source(1, current_sentence);
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindVague));
Problems::issue_problem_segment(
"The declaration %1 tries to set up a phrase which decides a "
"value which is too vaguely described. For example, 'To decide "
"which number is the target: ...' is fine, because 'number' "
"is clear about what kind of value should emerge; but 'To "
"decide which value is the target: ...' is not clear enough.");
Problems::issue_problem_end();
}
for (int k=1; k<=26; k++)
if ((Kinds::Behaviour::involves_var(KR, k)) &&
(Phrases::TypeData::tokens_contain_variable(&(ph->type_data), k) == FALSE)) {
current_sentence = Phrases::declaration_node(ph);
TEMPORARY_TEXT(var_letter)
PUT_TO(var_letter, 'A'+k-1);
Problems::quote_source(1, current_sentence);
Problems::quote_stream(2, var_letter);
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ReturnKindUndetermined));
Problems::issue_problem_segment(
"The declaration %1 tries to set up a phrase which decides a "
"value which is too vaguely described, because it involves "
"a kind variable (%2) which it can't determine through "
"usage.");
Problems::issue_problem_end();
DISCARD_TEXT(var_letter)
}
}
@<Throw problems for inline phrases named as constants@> =
phrase *ph;
LOOP_OVER(ph, phrase)
if ((Phrases::TypeData::invoked_inline(ph)) &&
(ToPhraseFamily::has_name_as_constant(ph->from))) {
current_sentence = Phrases::declaration_node(ph);
Problems::quote_source(1, current_sentence);
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NamedInline));
Problems::issue_problem_segment(
"The declaration %1 tries to give a name to a phrase which is "
"defined using inline Inform 6 code in (- markers -). Such "
"phrases can't be named and used as constants because they "
"have no independent existence, being instead made fresh "
"each time they are used.");
Problems::issue_problem_end();
}
@ The twilight gathers, but our work is far from done. Recall that we have
accumulated compilation requests for "To..." phrases, but haven't actually
acted on them yet.
We have to do this in quite an open-ended way, because compiling one phrase
can easily generate fresh requests for others. For instance, suppose we have
the definition "To expose (X - a value)" in play, and suppose that when
compiling the phrase "To advertise", Inform runs into the line "expose the
hoarding text". This causes it to issue a compilation request for "To expose
(X - a text)". Perhaps we've compiled such a form already, but perhaps we
haven't. Compilation therefore goes on until all requests have been dealt
with.
Compiling phrases also produces the need for other pieces of code to be
generated -- for example, suppose our phrase being compiled, "To advertise",
includes the text:
>> let Z be "Two for the price of one! Just [expose price]!";
We are going to need to compile "Two for the price of one! Just [expose price]!"
later on, in its own text substitution routine; but notice that it contains
the need for "To expose (X - a number)", and that will generate a further
phrase request.
Because of this and similar problems, it's impossible to compile all the
phrases alone: we must compile phrases, then things arising from them, then
phrases arising from those, then things arising from the phrases arising
from those, and so on, until we're done. The process is therefore structured
as a set of "coroutines" which each carry out as much as they can and then
hand over to the others to generate more work.
=
void ToPhraseFamily::compile_as_needed(imperative_defn_family *self,
int *total_phrases_compiled, int total_phrases_to_compile) {
int repeat = TRUE;
while (repeat) {
repeat = FALSE;
if (PhraseRequests::compilation_coroutine(
total_phrases_compiled, total_phrases_to_compile) > 0)
repeat = TRUE;
if (ListTogether::compilation_coroutine() > 0)
repeat = TRUE;
#ifdef IF_MODULE
if (LoopingOverScope::compilation_coroutine() > 0)
repeat = TRUE;
#endif
if (Strings::TextSubstitutions::compilation_coroutine(FALSE) > 0)
repeat = TRUE;
if (Propositions::Deferred::compilation_coroutine() > 0)
repeat = TRUE;
}
}
@ A few "To..." phrases have names, and can therefore be used as values in their
own right, a functional-programming sort of device. For example:

View file

@ -214,13 +214,13 @@ so on. Those absolute basics are made here.
-1, debugging, sequence_timer);
BENCH(Lists::check)
BENCH(ConstantLists::compile)
BENCH(Phrases::invoke_to_begin)
BENCH(ImperativeDefinitions::compile_as_needed)
BENCH(PhraseRequests::invoke_to_begin)
BENCH(PhraseRequests::compile_as_needed)
BENCH(Strings::compile_responses)
BENCH(Lists::check)
BENCH(ConstantLists::compile)
BENCH(RTRelations::compile_defined_relations)
BENCH(ImperativeDefinitions::compile_as_needed)
BENCH(PhraseRequests::compile_as_needed)
BENCH(Strings::TextSubstitutions::allow_no_further_text_subs)
@<Generate inter, part 4@> =

View file

@ -219,8 +219,6 @@ kind *Rules::to_kind(rule *R) {
}
@h Defining rules with imperative I7 code.
Once a rule has been created, it can be given a definition body in the form
of a //phrase// as follows:
=
void Rules::set_imperative_definition(rule *R, imperative_defn *id) {

View file

@ -319,7 +319,7 @@ void Phrases::Context::ensure_avl(rule *R) {
parse_node *save_cs = current_sentence;
current_sentence = id->at;
ph_stack_frame *phsf = &(ph->stack_frame);
ph_stack_frame *phsf = &(ph->compilation_data.stack_frame);
Frames::make_current(phsf);
Frames::set_stvol(phsf, R->variables_visible_in_definition);
@ -364,7 +364,7 @@ int Phrases::Context::compile_test_head(phrase *ph, rule *R) {
if (Wordings::nonempty(phrcd->activity_context))
@<Compile an activity or explicit condition test head@>;
if ((tests > 0) || (ph->compile_with_run_time_debugging)) {
if ((tests > 0) || (ph->compilation_data.compile_with_run_time_debugging)) {
Produce::inv_primitive(Emit::tree(), IF_BIP);
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_number, Hierarchy::find(DEBUG_RULES_HL));

View file

@ -28,178 +28,53 @@ the sub-structures, and aren't visible here; but they're relevant to the
code below.
=
typedef struct phrase {
struct imperative_defn *from;
typedef struct ph_compilation_data {
int inline_mor; /* one of the |*_MOR| values above */
int inline_wn; /* word number of inline I6 definition, or |-1| if not inline */
struct inter_schema *inter_head_defn; /* inline definition translated to inter, if possible */
struct inter_schema *inter_tail_defn; /* inline definition translated to inter, if possible */
int inter_defn_converted; /* has this been tried yet? */
int inline_mor; /* manner of return for inline I6 definition, or |UNKNOWN_NT| */
struct compilation_unit *owning_module;
struct package_request *requests_package;
struct ph_type_data type_data;
struct ph_runtime_context_data runtime_context_data;
struct ph_stack_frame stack_frame;
struct ph_options_data options_data;
int at_least_one_compiled_form_needed; /* do we still need to compile this? */
int compile_with_run_time_debugging; /* in the RULES command */
int at_least_one_compiled_form_needed; /* do we still need to compile this? */
struct compilation_unit *owning_module;
struct inter_schema *inter_front; /* inline definition translated to inter, if possible */
struct inter_schema *inter_back; /* inline definition translated to inter, if possible */
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;
} ph_compilation_data;
CLASS_DEFINITION
} phrase;
@ The life of a |phrase| structure begins when we look at the parse-tree
representation of its declaration in the source text.
A phrase is inline if and only if its definition consists of a single
invocation which is given as verbatim I6.
@
=
phrase *Phrases::create_from_preamble(imperative_defn *id) {
parse_node *p = id->at;
if ((p == NULL) || (Node::get_type(p) != IMPERATIVE_NT))
internal_error("a phrase preamble should be at a IMPERATIVE_NT node");
int inline_wn = -1; /* the word number of an inline I6 definition if any */
int mor = DONT_KNOW_MOR; /* and its manner of return */
@<Look for an inline definition@>;
ph_options_data phod;
ph_type_data phtd;
ph_stack_frame phsf;
ph_runtime_context_data phrcd;
if ((inline_wn >= 0) && (ImperativeDefinitionFamilies::allows_inline(id) == FALSE))
@<Inline is for To... phrases only@>;
@<Construct the PHOD@>;
@<Construct the PHTD, find the phrase options, find the documentation reference@>;
@<Construct the PHSF, using the PHTD and PHOD@>;
@<Construct the PHRCD@>;
phrase *new_ph;
@<Create the phrase structure@>;
return new_ph;
ph_compilation_data Phrases::new_compilation_data(parse_node *p) {
ph_compilation_data phcd;
phcd.inline_wn = -1;
phcd.inter_front = NULL;
phcd.inter_back = NULL;
phcd.inter_defn_converted = FALSE;
phcd.inline_mor = DONT_KNOW_MOR;
phcd.ph_iname = NULL;
phcd.owning_module = CompilationUnits::find(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();
return phcd;
}
@<Look for an inline definition@> =
if ((p->down) && (p->down->down) && (p->down->down->next == NULL))
Phrases::parse_possible_inline_defn(
Node::get_text(p->down->down), &inline_wn, &mor);
if (inline_wn >= 0) {
wchar_t *inline_defn = Lexer::word_text(inline_wn);
if (Wide::len(inline_defn) >= MAX_INLINE_DEFN_LENGTH)
@<Forbid overly long inline definitions@>;
}
@<Construct the PHOD@> =
phod = Phrases::Options::new(EMPTY_WORDING);
@<Construct the PHTD, find the phrase options, find the documentation reference@> =
phtd = Phrases::TypeData::new();
if (inline_wn >= 0) Phrases::TypeData::make_inline(&phtd);
@ The stack frame needs to know the kind of this phrase -- something like
= (text as Inform 6)
phrase number -> text
=
-- in order to work out what happens when values are decided by it later on.
We also tell the stack frame if there are phrase options, because then a
special parameter called |{phrase options}| is available when expanding
inline definitions.
@<Construct the PHSF, using the PHTD and PHOD@> =
phsf = Frames::new();
@<Construct the PHRCD@> =
phrcd = Phrases::Context::new();
@<Create the phrase structure@> =
LOGIF(PHRASE_CREATIONS, "Creating phrase: <%W>\n", id->log_text);
new_ph = CREATE(phrase);
new_ph->from = id;
new_ph->options_data = phod;
new_ph->runtime_context_data = phrcd;
new_ph->stack_frame = phsf;
new_ph->type_data = phtd;
new_ph->inline_wn = inline_wn;
new_ph->inter_head_defn = NULL;
new_ph->inter_tail_defn = NULL;
new_ph->inter_defn_converted = FALSE;
new_ph->inline_mor = mor;
new_ph->ph_iname = NULL;
new_ph->owning_module = CompilationUnits::find(current_sentence);
new_ph->requests_package = NULL;
if (inline_wn >= 0) {
new_ph->at_least_one_compiled_form_needed = FALSE;
} else {
new_ph->at_least_one_compiled_form_needed = TRUE;
}
new_ph->compile_with_run_time_debugging = FALSE;
@ That just leaves two problem messages about inline definitions:
@<Forbid overly long inline definitions@> =
LOG("Inline definition: <%s>\n", inline_defn);
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_InlineTooLong),
"the inline definition of this 'to...' phrase is too long",
"using a quantity of Inform 6 code which exceeds the fairly small limit "
"allowed. You will need either to write the phrase definition in Inform 7, "
"or to call an I6 routine which you define elsewhere with an 'Include ...'.");
inline_defn[MAX_INLINE_DEFN_LENGTH-1] = 0;
@<Inline is for To... phrases only@> =
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_InlineRule),
"only 'to...' phrases can be given inline Inform 6 definitions",
"and in particular rules and adjective definitions can't.");
@ Inline definitions open with a raw Inform 6 inclusion. The lexer processes
those as two words: first |(-|, which serves as a marker, and then the raw
text of the inclusion treated as a single "word".
Some inline definitions also mark themselves to be included only in To phrases
of the right sort: it makes no sense to respond "yes" to a phrase "To decide
what number is...", for instance.
=
<inline-phrase-definition> ::=
(- ### - in to only | ==> { DECIDES_NOTHING_MOR, -, <<inlinecode>> = Wordings::first_wn(WR[1]) }
(- ### - in to decide if only | ==> { DECIDES_CONDITION_MOR, -, <<inlinecode>> = Wordings::first_wn(WR[1]) }
(- ### - in to decide only | ==> { DECIDES_VALUE_MOR, -, <<inlinecode>> = Wordings::first_wn(WR[1]) }
(- ### | ==> { DONT_KNOW_MOR, -, <<inlinecode>> = Wordings::first_wn(WR[1]) }
(- ### ... ==> { DONT_KNOW_MOR, -, <<inlinecode>> = Wordings::first_wn(WR[1]) }; @<Issue PM_TailAfterInline problem@>
@<Issue PM_TailAfterInline problem@> =
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TailAfterInline),
"some unexpected text appears after the tail of an inline definition",
"placed within '(-' and '-)' markers to indicate that it is written in "
"Inform 6. Here, there seems to be something extra after the '-)'.");
==> { DONT_KNOW_MOR, - };
@ And this is used when the preamble is first looked at:
=
void Phrases::parse_possible_inline_defn(wording W, int *wn, int *mor) {
LOGIF(MATCHING, "form of inline: %W\n", W);
*wn = -1;
if (<inline-phrase-definition>(W)) { *wn = <<inlinecode>>; *mor = <<r>>; }
void Phrases::make_inline(phrase *ph, int inline_wn, int mor) {
ph->compilation_data.inline_wn = inline_wn;
ph->compilation_data.inline_mor = mor;
ph->compilation_data.at_least_one_compiled_form_needed = FALSE;
}
@
=
void Phrases::prepare_stack_frame(phrase *body) {
Phrases::TypeData::into_stack_frame(&(body->stack_frame), &(body->type_data),
Phrases::TypeData::into_stack_frame(&(body->compilation_data.stack_frame), &(body->type_data),
Phrases::TypeData::kind(&(body->type_data)), TRUE);
if (Phrases::Options::allows_options(&(body->options_data)))
LocalVariables::options_parameter_is_needed(&(body->stack_frame));
LocalVariables::options_parameter_is_needed(&(body->compilation_data.stack_frame));
}
@h Miscellaneous.
@ -226,42 +101,42 @@ void Phrases::write_HTML_representation(OUTPUT_STREAM, phrase *ph, int format) {
=
int Phrases::compiled_inline(phrase *ph) {
if (ph->inline_wn < 0) return FALSE;
if (ph->compilation_data.inline_wn < 0) return FALSE;
return TRUE;
}
wchar_t *Phrases::get_inline_definition(phrase *ph) {
if (ph->inline_wn < 0)
if (ph->compilation_data.inline_wn < 0)
internal_error("tried to access inline definition of non-inline phrase");
return Lexer::word_text(ph->inline_wn);
return Lexer::word_text(ph->compilation_data.inline_wn);
}
inter_schema *Phrases::get_inter_head(phrase *ph) {
if (ph->inter_defn_converted == FALSE) {
if (ph->inline_wn >= 0) {
InterSchemas::from_inline_phrase_definition(Phrases::get_inline_definition(ph), &(ph->inter_head_defn), &(ph->inter_tail_defn));
if (ph->compilation_data.inter_defn_converted == FALSE) {
if (ph->compilation_data.inline_wn >= 0) {
InterSchemas::from_inline_phrase_definition(Phrases::get_inline_definition(ph), &(ph->compilation_data.inter_front), &(ph->compilation_data.inter_back));
}
ph->inter_defn_converted = TRUE;
ph->compilation_data.inter_defn_converted = TRUE;
}
return ph->inter_head_defn;
return ph->compilation_data.inter_front;
}
inter_schema *Phrases::get_inter_tail(phrase *ph) {
if (ph->inter_defn_converted == FALSE) {
if (ph->inline_wn >= 0) {
InterSchemas::from_inline_phrase_definition(Phrases::get_inline_definition(ph), &(ph->inter_head_defn), &(ph->inter_tail_defn));
if (ph->compilation_data.inter_defn_converted == FALSE) {
if (ph->compilation_data.inline_wn >= 0) {
InterSchemas::from_inline_phrase_definition(Phrases::get_inline_definition(ph), &(ph->compilation_data.inter_front), &(ph->compilation_data.inter_back));
}
ph->inter_defn_converted = TRUE;
ph->compilation_data.inter_defn_converted = TRUE;
}
return ph->inter_tail_defn;
return ph->compilation_data.inter_back;
}
inter_name *Phrases::iname(phrase *ph) {
if (ph->ph_iname == NULL) {
package_request *PR = Hierarchy::package(ph->owning_module, ADJECTIVE_PHRASES_HAP);
ph->ph_iname = Hierarchy::make_iname_in(DEFINITION_FN_HL, PR);
if (ph->compilation_data.ph_iname == NULL) {
package_request *PR = Hierarchy::package(ph->compilation_data.owning_module, ADJECTIVE_PHRASES_HAP);
ph->compilation_data.ph_iname = Hierarchy::make_iname_in(DEFINITION_FN_HL, PR);
}
return ph->ph_iname;
return ph->compilation_data.ph_iname;
}
parse_node *Phrases::declaration_node(phrase *ph) {
@ -277,35 +152,12 @@ response to "requests". All other phrases are compiled just once.
=
void Phrases::compile(phrase *ph, int *i, int max_i,
stacked_variable_owner_list *legible, to_phrase_request *req, rule *R) {
if ((req) || (ph->at_least_one_compiled_form_needed)) {
if ((req) || (ph->compilation_data.at_least_one_compiled_form_needed)) {
Routines::Compile::routine(ph, legible, req, R);
@<Move along the progress bar if it's this phrase's first compilation@>;
}
}
@<Move along the progress bar if it's this phrase's first compilation@> =
if (ph->at_least_one_compiled_form_needed) {
ph->at_least_one_compiled_form_needed = FALSE;
(*i)++;
ProgressBar::update(4, ((float) (*i))/((float) max_i));
}
@h Basic mode main.
=
void Phrases::invoke_to_begin(void) {
if (Task::begin_execution_af_to_begin()) {
inter_name *iname = Hierarchy::find(SUBMAIN_HL);
packaging_state save = Routines::begin(iname);
imperative_defn *beginner = ToPhraseFamily::to_begin();
if (beginner) {
kind *void_kind = Kinds::function_kind(0, NULL, K_nil);
inter_name *IS = Routines::Compile::iname(beginner->body_of_defn,
PhraseRequests::make_request(beginner->body_of_defn,
void_kind, NULL, EMPTY_WORDING));
Produce::inv_call_iname(Emit::tree(), IS);
if (ph->compilation_data.at_least_one_compiled_form_needed) {
ph->compilation_data.at_least_one_compiled_form_needed = FALSE;
(*i)++;
ProgressBar::update(4, ((float) (*i))/((float) max_i));
}
Routines::end(save);
Hierarchy::make_available(Emit::tree(), iname);
}
}

View file

@ -60,7 +60,7 @@ int Invocations::Inline::csi_inline_outer(value_holster *VH,
if (Phrases::TypeData::block_follows(ph)) @<Open a code block@>
else @<Release any variables created inline@>;
return ph->inline_mor;
return ph->compilation_data.inline_mor;
}
@ Inline invocations, unlike invocations by function call, are allowed to
@ -203,7 +203,7 @@ the fixed text "phrase options" expands to the whole bitmap.
=
<name-local-to-inline-stack-frame> internal {
local_variable *lvar = LocalVariables::parse(&(ph_being_parsed->stack_frame), W);
local_variable *lvar = LocalVariables::parse(&(ph_being_parsed->compilation_data.stack_frame), W);
if (lvar) {
==> { -, lvar };
return TRUE;
@ -1569,7 +1569,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(&(ph->stack_frame), LW);
lvar = LocalVariables::parse(&(ph->compilation_data.stack_frame), LW);
if (lvar) {
int tok = LocalVariables::get_parameter_number(lvar);
if (tok >= 0) return tokens->args[tok];

View file

@ -36,7 +36,7 @@ void Routines::Compile::routine(phrase *ph,
@<Compile some commentary about the routine to follow@>;
packaging_state save = Routines::begin_framed(Routines::Compile::iname(ph, req), &(ph->stack_frame));
packaging_state save = Routines::begin_framed(Routines::Compile::iname(ph, req), &(ph->compilation_data.stack_frame));
@<Compile the body of the routine@>;
@ -52,7 +52,7 @@ void Routines::Compile::routine(phrase *ph,
ImperativeDefinitions::write_comment_describing(ph->from);
@<Set up the stack frame for this compilation request@> =
ph_stack_frame *phsf = &(ph->stack_frame);
ph_stack_frame *phsf = &(ph->compilation_data.stack_frame);
ph_type_data *phtd = &(ph->type_data);
Frames::make_current(phsf);

View file

@ -20,7 +20,7 @@ inter_name *Phrases::Constants::iname(constant_phrase *cphr) {
if (cphr->cphr_iname == NULL) {
phrase *ph = ToPhraseFamily::body_of_constant(cphr);
if (ph == NULL) internal_error("cannot reconstruct phrase from cphr");
package_request *P = Hierarchy::package_within(CLOSURES_HAP, ph->requests_package);
package_request *P = Hierarchy::package_within(CLOSURES_HAP, ph->compilation_data.requests_package);
cphr->cphr_iname = Hierarchy::make_iname_in(CLOSURE_DATA_HL, P);
}
return cphr->cphr_iname;

View file

@ -55,7 +55,7 @@ to_phrase_request *PhraseRequests::make_request(phrase *ph, kind *K,
compilation_unit *cm = CompilationUnits::current();
if (ph->from->at) cm = CompilationUnits::find(ph->from->at);
package_request *P = Hierarchy::package_within(REQUESTS_HAP, ph->requests_package);
package_request *P = Hierarchy::package_within(REQUESTS_HAP, ph->compilation_data.requests_package);
req->req_iname = Hierarchy::make_localised_iname_in(PHRASE_FN_HL, P, cm);
for (int i=0; i<27; i++) req->kind_variables_interpretation[i] = NULL;
@ -127,27 +127,6 @@ inter_name *PhraseRequests::make_iname(phrase *ph, kind *req_kind) {
return Routines::Compile::iname(ph, req);
}
@ The following coroutine compiles any pending requests for phrase compilation
since the last time it was called.
=
to_phrase_request *latest_request_granted = NULL;
int PhraseRequests::compilation_coroutine(int *i, int max_i) {
int N = 0;
while (TRUE) {
to_phrase_request *req;
if (latest_request_granted == NULL) req = FIRST_OBJECT(to_phrase_request);
else req = NEXT_OBJECT(latest_request_granted, to_phrase_request);
if (req == NULL) break;
latest_request_granted = req;
Phrases::compile(latest_request_granted->requested_phrase,
i, max_i, NULL, latest_request_granted, NULL);
N++;
}
return N;
}
@ In the course of doing this, |Phrases::compile| calls us back to ask us
to write a comment about this:
@ -175,3 +154,96 @@ kind **PhraseRequests::kind_variables_for_request(to_phrase_request *req) {
if (req == NULL) internal_error("null request");
return req->kind_variables_interpretation;
}
@ The twilight gathers, but our work is far from done. Recall that we have
accumulated compilation requests for "To..." phrases, but haven't actually
acted on them yet.
We have to do this in quite an open-ended way, because compiling one phrase
can easily generate fresh requests for others. For instance, suppose we have
the definition "To expose (X - a value)" in play, and suppose that when
compiling the phrase "To advertise", Inform runs into the line "expose the
hoarding text". This causes it to issue a compilation request for "To expose
(X - a text)". Perhaps we've compiled such a form already, but perhaps we
haven't. Compilation therefore goes on until all requests have been dealt
with.
Compiling phrases also produces the need for other pieces of code to be
generated -- for example, suppose our phrase being compiled, "To advertise",
includes the text:
>> let Z be "Two for the price of one! Just [expose price]!";
We are going to need to compile "Two for the price of one! Just [expose price]!"
later on, in its own text substitution routine; but notice that it contains
the need for "To expose (X - a number)", and that will generate a further
phrase request.
Because of this and similar problems, it's impossible to compile all the
phrases alone: we must compile phrases, then things arising from them, then
phrases arising from those, then things arising from the phrases arising
from those, and so on, until we're done. The process is therefore structured
as a set of "coroutines" which each carry out as much as they can and then
hand over to the others to generate more work.
=
void PhraseRequests::compile_as_needed(void) {
int repeat = TRUE;
while (repeat) {
repeat = FALSE;
if (PhraseRequests::compilation_coroutine(
&total_phrases_compiled, total_phrases_to_compile) > 0)
repeat = TRUE;
if (ListTogether::compilation_coroutine() > 0)
repeat = TRUE;
#ifdef IF_MODULE
if (LoopingOverScope::compilation_coroutine() > 0)
repeat = TRUE;
#endif
if (Strings::TextSubstitutions::compilation_coroutine(FALSE) > 0)
repeat = TRUE;
if (Propositions::Deferred::compilation_coroutine() > 0)
repeat = TRUE;
}
}
@ The following coroutine compiles any pending requests for phrase compilation
since the last time it was called.
=
to_phrase_request *latest_request_granted = NULL;
int PhraseRequests::compilation_coroutine(int *i, int max_i) {
int N = 0;
while (TRUE) {
to_phrase_request *req;
if (latest_request_granted == NULL) req = FIRST_OBJECT(to_phrase_request);
else req = NEXT_OBJECT(latest_request_granted, to_phrase_request);
if (req == NULL) break;
latest_request_granted = req;
Phrases::compile(latest_request_granted->requested_phrase,
i, max_i, NULL, latest_request_granted, NULL);
N++;
}
return N;
}
@h Basic mode main.
=
void PhraseRequests::invoke_to_begin(void) {
if (Task::begin_execution_af_to_begin()) {
inter_name *iname = Hierarchy::find(SUBMAIN_HL);
packaging_state save = Routines::begin(iname);
imperative_defn *beginner = ToPhraseFamily::to_begin();
if (beginner) {
kind *void_kind = Kinds::function_kind(0, NULL, K_nil);
inter_name *IS = Routines::Compile::iname(beginner->body_of_defn,
PhraseRequests::make_request(beginner->body_of_defn,
void_kind, NULL, EMPTY_WORDING));
Produce::inv_call_iname(Emit::tree(), IS);
}
Routines::end(save);
Hierarchy::make_available(Emit::tree(), iname);
}
}

View file

@ -6,7 +6,7 @@ To compile the bones of functions, and their local variable declarations.
=
void Routines::prepare_for_requests(phrase *ph) {
ph->requests_package = Hierarchy::package(ph->owning_module, PHRASES_HAP);
ph->compilation_data.requests_package = Hierarchy::package(ph->compilation_data.owning_module, PHRASES_HAP);
}
@ The code following is used throughout Inform, whenever we want to compile

View file

@ -36,7 +36,7 @@ rule_compilation_data RTRules::new_compilation_data(rule *R) {
ph_stack_frame *RTRules::stack_frame(rule *R) {
if ((R == NULL) || (R->defn_as_I7_source == NULL)) return NULL;
return &(R->defn_as_I7_source->body_of_defn->stack_frame);
return &(R->defn_as_I7_source->body_of_defn->compilation_data.stack_frame);
}
void RTRules::prepare_rule(imperative_defn *id, rule *R) {
@ -44,7 +44,8 @@ void RTRules::prepare_rule(imperative_defn *id, rule *R) {
package_request *P = RTRules::package(R);
if (Wordings::empty(rfd->constant_name))
Hierarchy::markup_wording(P, RULE_NAME_HMD, Node::get_text(id->at));
id->body_of_defn->ph_iname = Hierarchy::make_localised_iname_in(RULE_FN_HL, P, id->body_of_defn->owning_module);
id->body_of_defn->compilation_data.ph_iname =
Hierarchy::make_localised_iname_in(RULE_FN_HL, P, id->body_of_defn->compilation_data.owning_module);
}
package_request *RTRules::package(rule *R) {