1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-03 07:24:58 +03:00

Simplified response compilation

This commit is contained in:
Graham Nelson 2021-04-23 14:19:14 +01:00
parent d71f3bdf50
commit 11f053a502
30 changed files with 859 additions and 809 deletions

View file

@ -463,10 +463,8 @@ will be required to pass <span class="extract"><span class="extract-syntax">&lt;
<span class="plain-syntax"> </span><a href="3-tr.html#SP7_4" class="function-link"><span class="function-syntax">Translations::plus_responses</span></a><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="element-syntax">next</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">else</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;extra-response&gt;</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">))) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">code</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="identifier-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Responses::response_cue</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">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">code</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">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-rls.html#SP21" class="function-link"><span class="function-syntax">Rules::set_response</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">code</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</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="identifier-syntax">Responses::set_via_translation</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</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">));</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">StandardProblems::sentence_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_I6ResponsesAwry</span><span class="plain-syntax">),</span>

View file

@ -2333,7 +2333,7 @@ but that's not evident without a lot of contextual checking.
<span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_CONSTANT_of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_text</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_rule</span><span class="plain-syntax">(</span><span class="identifier-syntax">constant</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">constant</span><span class="plain-syntax">, </span><span class="identifier-syntax">response_code_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Responses::assert_response_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">c</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="6-rls.html#SP22" class="function-link"><span class="function-syntax">Rules::now_rule_needs_response</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">c</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</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">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>

View file

@ -635,7 +635,7 @@ possibility we store one of these:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rr</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">Rules::get_response_content</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">code</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Rules::get_response_replacement_wording</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">code</span><span 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="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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">code</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">code</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">26</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responses</span><span class="plain-syntax">[</span><span class="identifier-syntax">code</span><span class="plain-syntax">].</span><span class="element-syntax">content</span><span class="plain-syntax">;</span>
@ -653,7 +653,7 @@ created with <a href="6-rls.html#SP21" class="internal">Rules::set_response</a>:
</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_response</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">Rules::set_response</span></span>:<br/>Translation Requests - <a href="3-tr.html#SP7_4">&#167;7.4</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">code</span><span class="plain-syntax">, </span><span class="identifier-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Rules::set_response</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">code</span><span class="plain-syntax">, </span><span class="identifier-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</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 rule defines response"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">code</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">code</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">26</span><span class="plain-syntax">)) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"response out of range"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responses</span><span class="plain-syntax">[</span><span class="identifier-syntax">code</span><span class="plain-syntax">].</span><span class="element-syntax">message</span><span class="plain-syntax"> = </span><span class="identifier-syntax">resp</span><span class="plain-syntax">;</span>
@ -670,7 +670,7 @@ tries to change its wording to the new text <span class="extract"><span class="e
</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::now_rule_needs_response</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">code</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">Rules::now_rule_needs_response</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">Rules::now_rule_needs_response</span></span>:<br/>Assertions - <a href="4-ass.html#SP6_3_41_6">&#167;6.3.41.6</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">code</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">R</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 rule uses response"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">code</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">code</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">26</span><span class="plain-syntax">)) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"response out of range"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responses</span><span class="plain-syntax">[</span><span class="identifier-syntax">code</span><span class="plain-syntax">].</span><span class="element-syntax">used</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>

View file

@ -341,7 +341,7 @@ so on. Those absolute basics are made here.
<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">Closures::compile_closures</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="1-htc.html#SP3" class="function-link"><span class="function-syntax">Sequence::compile_function_resources</span></a><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">Responses::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">Responses::compile_synoptic_resources</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="1-htc.html#SP5" class="function-link"><span class="function-syntax">Sequence::compile_literal_resources</span></a><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><a href="1-htc.html#SP3" class="function-link"><span class="function-syntax">Sequence::compile_function_resources</span></a><span class="plain-syntax">)</span>
@ -448,6 +448,7 @@ other's bodies. But I think the term "coroutine" is reasonable just the same.
<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">() &gt; </span><span class="constant-syntax">0</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="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">LoopingOverScope::compilation_coroutine</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</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">Responses::compilation_coroutine</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</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">TextSubstitutions::compilation_coroutine</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</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">DeferredPropositions::compilation_coroutine</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</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>

View file

@ -249,7 +249,7 @@ kinds of value:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_of_constant</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_text</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Responses::compile_general</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cr.html#SP2" class="function-link"><span class="function-syntax">CompileRvalues::text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="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>
@ -339,6 +339,105 @@ contexts by using a tilde: <span class="extract"><span class="extract-syntax">~a
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-cr.html#SP1_3">&#167;1.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Texts can be compiled in four different ways, so the following splits into
four cases. Note that responses take the form
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> "blah blah blah" ( letter )</span>
</pre>
<p class="commentary">so the penultimate word, if it's there, is the letter.
</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">CompileRvalues::text</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">CompileRvalues::text</span></span>:<br/><a href="2-cr.html#SP1_3">&#167;1.3</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">str</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::non_void_context</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"text in void context"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</span><span class="plain-syntax">, </span><span class="identifier-syntax">explicit_literal_ANNOT</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-cr.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">This is an explicit text</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">SW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</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">unescaped</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_unescaped_ANNOT</span><span 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">SW</span><span class="plain-syntax">)) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"text without wording"</span><span 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::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">2</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="function-syntax">&lt;response-letter&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">)-1)))) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-cr.html#SP2_2" class="named-paragraph-link"><span class="named-paragraph">This is a response text</span><span class="named-paragraph-number">2.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">unescaped</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Vocabulary::test_flags</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">), </span><span class="identifier-syntax">TEXTWITHSUBS_MC</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-cr.html#SP2_3" class="named-paragraph-link"><span class="named-paragraph">This is a text substitution</span><span class="named-paragraph-number">2.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">unescaped</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-cr.html#SP2_4" class="named-paragraph-link"><span class="named-paragraph">This is an unescaped text literal</span><span class="named-paragraph-number">2.4</span></a></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="named-paragraph-container code-font"><a href="2-cr.html#SP2_5" class="named-paragraph-link"><span class="named-paragraph">This is a regular text literal</span><span class="named-paragraph-number">2.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>&#167;2.1. </b>Not explicit in the sense of an advisory sticker on an Eminem CD: explicit
in providing a text stream for its content, rather than a wording from the
source text. (This usually means it has been manufactured somewhere in the
compiler, rather than parsed from the source.)
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">This is an explicit text</span><span class="named-paragraph-number">2.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">Node::get_explicit_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::non_void_context</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">Emit::holster_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_explicit_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</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">"unvalued SCG"</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">A</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</span><span class="plain-syntax">, </span><span class="identifier-syntax">constant_number_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::non_void_context</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">Holsters::holster_pair</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">A</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-cr.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">This is a response text</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</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="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">rule_being_compiled</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">Rules::rule_allows_responses</span><span class="plain-syntax">(</span><span class="identifier-syntax">rule_being_compiled</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">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_ResponseContextWrong</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"lettered responses can only be used in named rules"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"not in any of the other contexts in which quoted text can appear."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Rules::get_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">rule_being_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">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_ResponseDuplicated</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this duplicates a response letter"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which is not allowed: if a bracketed letter like (A) is used to mark "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"some text as a response, then it can only occur once in its rule."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Responses::set_via_source_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule_being_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">SW</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-cr.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_3" class="paragraph-anchor"></a><b>&#167;2.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">This is a text substitution</span><span class="named-paragraph-number">2.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">TextSubstitutions::text_substitution_cue</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">SW</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-cr.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_4" class="paragraph-anchor"></a><b>&#167;2.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">This is an unescaped text literal</span><span class="named-paragraph-number">2.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">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TextLiterals::to_value_unescaped</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Emit::holster_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">val_iname</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-cr.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_5" class="paragraph-anchor"></a><b>&#167;2.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">This is a regular text literal</span><span class="named-paragraph-number">2.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">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TextLiterals::to_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Emit::holster_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">val_iname</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-cr.html#SP2">&#167;2</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-cv.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-cv.html">cv</a></li><li class="progresscurrent">cr</li><li class="progresssection"><a href="2-cl.html">cl</a></li><li class="progresssection"><a href="2-cc.html">cc</a></li><li class="progresschapter"><a href="3-sf.html">3</a></li><li class="progresschapter"><a href="4-cs.html">4</a></li><li class="progresschapter"><a href="5-cbal.html">5</a></li><li class="progressnext"><a href="2-cl.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -208,7 +208,7 @@ Here <span class="extract"><span class="extract-syntax">this</span></span> is th
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">m</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">ADOPT_LOCAL_STACK_FRAME_ISSBM</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_CONSTANT_of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">other</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">constant</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_response</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rule_to_which_this_is_a_response</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_rule</span><span class="plain-syntax">(</span><span class="identifier-syntax">other</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">constant</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">response_marker_within_that_rule</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Responses::get_marker_from_response_spec</span><span class="plain-syntax">(</span><span class="identifier-syntax">other</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">constant</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">response_marker_within_that_rule</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_response_marker</span><span class="plain-syntax">(</span><span class="identifier-syntax">other</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">constant</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">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">m</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">CAST_TO_KIND_OF_OTHER_TERM_ISSBM</span><span class="plain-syntax">) </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">other</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">term_checked_as_kind</span><span class="plain-syntax">;</span>

View file

@ -172,7 +172,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">responses</span><span class="plain-syntax">[</span><span class="identifier-syntax">l</span><span class="plain-syntax">].</span><span class="identifier-syntax">message</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><a href="2-ifs.html#SP13" class="function-link"><span class="function-syntax">Index::extra_div_open_nested</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="constant-syntax">1000000</span><span class="plain-syntax">+</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="constant-syntax">2</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">HTML_TAG</span><span class="plain-syntax">(</span><span class="string-syntax">"br"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Responses::index_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">l</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">responses</span><span class="plain-syntax">[</span><span class="identifier-syntax">l</span><span class="plain-syntax">].</span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-rls.html#SP12" class="function-link"><span class="function-syntax">IXRules::index_response</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">l</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">responses</span><span class="plain-syntax">[</span><span class="identifier-syntax">l</span><span class="plain-syntax">].</span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><a href="2-ifs.html#SP13" class="function-link"><span class="function-syntax">Index::extra_div_close_nested</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
@ -907,6 +907,34 @@ being the relevant scene or action for a rule.
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure rule_context is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b>When we index a response, we also provide a paste button for the source
text to assert a change:
</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">IXRules::index_response</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">IXRules::index_response</span></span>:<br/><a href="2-rls.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="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>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN_WITH</span><span class="plain-syntax">(</span><span class="string-syntax">"span"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"style=\"color: #ffffff; "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"font-family: 'Courier New', Courier, monospace; background-color: #8080ff;\""</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;%c&amp;nbsp;&amp;nbsp; "</span><span class="plain-syntax">, </span><span class="character-syntax">'A'</span><span class="plain-syntax"> + </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"span"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN_WITH</span><span class="plain-syntax">(</span><span class="string-syntax">"span"</span><span class="plain-syntax">, </span><span class="string-syntax">"style=\"color: #000066;\""</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">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">the_ts</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">unsubstituted_text</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">"span"</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;"</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">S</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">S</span><span class="plain-syntax">, </span><span class="string-syntax">"%+W response (%c)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">, </span><span class="character-syntax">'A'</span><span class="plain-syntax"> + </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PasteButtons::paste_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</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;&lt;i&gt;name&lt;/i&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">"&amp;nbsp;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</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">S</span><span class="plain-syntax">, </span><span class="string-syntax">"The %+W response (%c) is \"New text.\"."</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">S</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;&lt;i&gt;set&lt;/i&gt;"</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">S</span><span class="plain-syntax">)</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-inf.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-ifs.html">ifs</a></li><li class="progresssection"><a href="2-dr.html">dr</a></li><li class="progresssection"><a href="2-li.html">li</a></li><li class="progresssection"><a href="2-ipw.html">ipw</a></li><li class="progresssection"><a href="2-ki.html">ki</a></li><li class="progresssection"><a href="2-ie.html">ie</a></li><li class="progresssection"><a href="2-ih.html">ih</a></li><li class="progresssection"><a href="2-ins.html">ins</a></li><li class="progresssection"><a href="2-adj.html">adj</a></li><li class="progresssection"><a href="2-vrb.html">vrb</a></li><li class="progresssection"><a href="2-prp.html">prp</a></li><li class="progresssection"><a href="2-inf.html">inf</a></li><li class="progresscurrent">rls</li><li class="progresssection"><a href="2-act.html">act</a></li><li class="progresssection"><a href="2-pi.html">pi</a></li><li class="progresschapter"><a href="3-fgr.html">3</a></li><li class="progresschapter"><a href="4-sg.html">4</a></li><li class="progressnext"><a href="2-act.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -192,7 +192,7 @@ by hand as belonging to the same nodes as their progenitors:
</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">CompilationUnits::assign_to_same_unit</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">CompilationUnits::assign_to_same_unit</span></span>:<br/>Text Substitutions - <a href="4-ts.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompilationUnits::assign_to_same_unit</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">CompilationUnits::assign_to_same_unit</span></span>:<br/>Text Substitutions - <a href="4-ts.html#SP7_3">&#167;7.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-cu.html#SP3" class="function-link"><span class="function-syntax">CompilationUnits::join</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_unit</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -92,7 +92,7 @@ enforced; it's fine to store arbitrary data with <span class="extract"><span cla
</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">EmitArrays::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">EmitArrays::begin</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a><br/>Text Literals - <a href="4-tl.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">&#167;1</a><br/>Responses - <a href="4-rsp.html#SP5_1">&#167;5.1</a>, <a href="4-rsp.html#SP6_3">&#167;6.3</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">&#167;2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">&#167;18.1</a><br/>List Together - <a href="5-lt.html#SP3_1">&#167;3.1</a><br/>Rules - <a href="5-rls.html#SP8_1_1">&#167;8.1.1</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP9">&#167;9</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a>, <a href="6-tm.html#SP3">&#167;3</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a><br/>Parsing - <a href="8-prs.html#SP2">&#167;2</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</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">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::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">EmitArrays::begin</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a><br/>Text Literals - <a href="4-tl.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">&#167;1</a><br/>Responses - <a href="4-rsp.html#SP7_2">&#167;7.2</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">&#167;2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">&#167;18.1</a><br/>List Together - <a href="5-lt.html#SP3_1">&#167;3.1</a><br/>Rules - <a href="5-rls.html#SP8_1_1">&#167;8.1.1</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP9">&#167;9</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a>, <a href="6-tm.html#SP3">&#167;3</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a><br/>Parsing - <a href="8-prs.html#SP2">&#167;2</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</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">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">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Packaging::enter_home_of</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP9" class="function-link"><span class="function-syntax">EmitArrays::begin_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</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="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax">;</span>
@ -158,11 +158,11 @@ which would be a typesafe list in I7, so they can be absolutely any data,
</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">EmitArrays::numeric_entry</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">EmitArrays::numeric_entry</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a>, <a href="4-ll.html#SP7_1">&#167;7.1</a><br/>Responses - <a href="4-rsp.html#SP6_3">&#167;6.3</a>, <a href="4-rsp.html#SP6_3_1_1">&#167;6.3.1.1</a>, <a href="4-rsp.html#SP6_3_1_2">&#167;6.3.1.2</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">&#167;2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a>, <a href="5-rsfk.html#SP11">&#167;11</a>, <a href="5-rsfk.html#SP18_1_1_1">&#167;18.1.1.1</a>, <a href="5-rsfk.html#SP18_1_1_2">&#167;18.1.1.2</a>, <a href="5-rsfk.html#SP22">&#167;22</a><br/>Rules - <a href="5-rls.html#SP8_1_1">&#167;8.1.1</a>, <a href="5-rls.html#SP8_1_2">&#167;8.1.2</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP4_1_3">&#167;4.1.3</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP8">&#167;8</a>, <a href="5-rart.html#SP9_2">&#167;9.2</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1_1_3">&#167;4.1.1.1.1.3</a>, <a href="5-rsft.html#SP4_1_1_1_1_4">&#167;4.1.1.1.1.4</a>, <a href="5-rsft.html#SP4_2_3">&#167;4.2.3</a>, <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a><br/>Timed Rules - <a href="6-tr.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a>, <a href="7-act.html#SP2">&#167;2</a><br/>Action Patterns - <a href="7-ap.html#SP5">&#167;5</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::numeric_entry</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">EmitArrays::numeric_entry</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a>, <a href="4-ll.html#SP7_1">&#167;7.1</a><br/>Responses - <a href="4-rsp.html#SP7_2">&#167;7.2</a>, <a href="4-rsp.html#SP7_2_1_1">&#167;7.2.1.1</a>, <a href="4-rsp.html#SP7_2_1_2">&#167;7.2.1.2</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">&#167;2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a>, <a href="5-rsfk.html#SP11">&#167;11</a>, <a href="5-rsfk.html#SP18_1_1_1">&#167;18.1.1.1</a>, <a href="5-rsfk.html#SP18_1_1_2">&#167;18.1.1.2</a>, <a href="5-rsfk.html#SP22">&#167;22</a><br/>Rules - <a href="5-rls.html#SP8_1_1">&#167;8.1.1</a>, <a href="5-rls.html#SP8_1_2">&#167;8.1.2</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP4_1_3">&#167;4.1.3</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP8">&#167;8</a>, <a href="5-rart.html#SP9_2">&#167;9.2</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1_1_3">&#167;4.1.1.1.1.3</a>, <a href="5-rsft.html#SP4_1_1_1_1_4">&#167;4.1.1.1.1.4</a>, <a href="5-rsft.html#SP4_2_3">&#167;4.2.3</a>, <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a><br/>Timed Rules - <a href="6-tr.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a>, <a href="7-act.html#SP2">&#167;2</a><br/>Action Patterns - <a href="7-ap.html#SP5">&#167;5</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP10" class="function-link"><span class="function-syntax">EmitArrays::entry_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::iname_entry</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">EmitArrays::iname_entry</span></span>:<br/>List Literals - <a href="4-ll.html#SP2">&#167;2</a>, <a href="4-ll.html#SP7_2">&#167;7.2</a><br/>Text Literals - <a href="4-tl.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">&#167;1</a><br/>Responses - <a href="4-rsp.html#SP5_1">&#167;5.1</a>, <a href="4-rsp.html#SP6_3_1_1">&#167;6.3.1.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a>, <a href="5-rsfk.html#SP11">&#167;11</a>, <a href="5-rsfk.html#SP14">&#167;14</a>, <a href="5-rsfk.html#SP22">&#167;22</a><br/>List Together - <a href="5-lt.html#SP3_1">&#167;3.1</a><br/>Rules - <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_2">&#167;4.1.2</a>, <a href="5-rart.html#SP4_1_2_1">&#167;4.1.2.1</a>, <a href="5-rart.html#SP4_1_3">&#167;4.1.3</a>, <a href="5-rart.html#SP4_1_6">&#167;4.1.6</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP9_2">&#167;9.2</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">&#167;4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1_5">&#167;4.1.1.1.1.5</a>, <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a>, <a href="6-tm.html#SP3">&#167;3</a><br/>Timed Rules - <a href="6-tr.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP2">&#167;2</a>, <a href="7-act.html#SP3">&#167;3</a><br/>Action Patterns - <a href="7-ap.html#SP5">&#167;5</a><br/>Command Grammar Lines - <a href="8-cgl.html#SP2">&#167;2</a>, <a href="8-cgl.html#SP5">&#167;5</a>, <a href="8-cgl.html#SP7">&#167;7</a>, <a href="8-cgl.html#SP10">&#167;10</a><br/>Noun Filter Tokens - <a href="8-nft.html#SP3">&#167;3</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::iname_entry</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">EmitArrays::iname_entry</span></span>:<br/>List Literals - <a href="4-ll.html#SP2">&#167;2</a>, <a href="4-ll.html#SP7_2">&#167;7.2</a><br/>Text Literals - <a href="4-tl.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">&#167;1</a><br/>Responses - <a href="4-rsp.html#SP7_2_1_1">&#167;7.2.1.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a>, <a href="5-rsfk.html#SP11">&#167;11</a>, <a href="5-rsfk.html#SP14">&#167;14</a>, <a href="5-rsfk.html#SP22">&#167;22</a><br/>List Together - <a href="5-lt.html#SP3_1">&#167;3.1</a><br/>Rules - <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_2">&#167;4.1.2</a>, <a href="5-rart.html#SP4_1_2_1">&#167;4.1.2.1</a>, <a href="5-rart.html#SP4_1_3">&#167;4.1.3</a>, <a href="5-rart.html#SP4_1_6">&#167;4.1.6</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP9_2">&#167;9.2</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">&#167;4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1_5">&#167;4.1.1.1.1.5</a>, <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a>, <a href="6-tm.html#SP3">&#167;3</a><br/>Timed Rules - <a href="6-tr.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP2">&#167;2</a>, <a href="7-act.html#SP3">&#167;3</a><br/>Action Patterns - <a href="7-ap.html#SP5">&#167;5</a><br/>Command Grammar Lines - <a href="8-cgl.html#SP2">&#167;2</a>, <a href="8-cgl.html#SP5">&#167;5</a>, <a href="8-cgl.html#SP7">&#167;7</a>, <a href="8-cgl.html#SP10">&#167;10</a><br/>Noun Filter Tokens - <a href="8-nft.html#SP3">&#167;3</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">alias</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">alias</span><span class="plain-syntax"> = </span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::get_veneer_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NOTHING_VSYMB</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">alias</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InterNames::to_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
@ -175,7 +175,7 @@ which would be a typesafe list in I7, so they can be absolutely any data,
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">NULL_HL</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">EmitArrays::text_entry</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">EmitArrays::text_entry</span></span>:<br/>Responses - <a href="4-rsp.html#SP6_3_1_1">&#167;6.3.1.1</a><br/>Rules - <a href="5-rls.html#SP12">&#167;12</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_1">&#167;4.1.1</a>, <a href="5-rart.html#SP4_1_5">&#167;4.1.5</a>, <a href="5-rart.html#SP5">&#167;5</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">content</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::text_entry</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">EmitArrays::text_entry</span></span>:<br/>Responses - <a href="4-rsp.html#SP7_2_1_1">&#167;7.2.1.1</a><br/>Rules - <a href="5-rls.html#SP12">&#167;12</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_1">&#167;4.1.1</a>, <a href="5-rart.html#SP4_1_5">&#167;4.1.5</a>, <a href="5-rart.html#SP5">&#167;5</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">content</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::text_value</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">content</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP10" class="function-link"><span class="function-syntax">EmitArrays::entry_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
@ -213,7 +213,7 @@ difference to compiled code.
</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">EmitArrays::end</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">EmitArrays::end</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a><br/>Text Literals - <a href="4-tl.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">&#167;1</a><br/>Responses - <a href="4-rsp.html#SP5_1">&#167;5.1</a>, <a href="4-rsp.html#SP6_3">&#167;6.3</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">&#167;2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a>, <a href="5-rsfk.html#SP18_1">&#167;18.1</a><br/>List Together - <a href="5-lt.html#SP3_1">&#167;3.1</a><br/>Rules - <a href="5-rls.html#SP8_1_5">&#167;8.1.5</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP4_1_2">&#167;4.1.2</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP9">&#167;9</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">&#167;4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1">&#167;4.1.1.1.1</a>, <a href="5-rsft.html#SP4_2">&#167;4.2</a>, <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a>, <a href="6-tm.html#SP3">&#167;3</a><br/>Timed Rules - <a href="6-tr.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a>, <a href="7-act.html#SP2">&#167;2</a><br/>Action Patterns - <a href="7-ap.html#SP5">&#167;5</a><br/>Parsing - <a href="8-prs.html#SP2">&#167;2</a><br/>Command Grammars - <a href="8-cg.html#SP7">&#167;7</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</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">EmitArrays::end</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">EmitArrays::end</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a><br/>Text Literals - <a href="4-tl.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">&#167;1</a><br/>Responses - <a href="4-rsp.html#SP7_2">&#167;7.2</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">&#167;2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a>, <a href="5-rsfk.html#SP18_1">&#167;18.1</a><br/>List Together - <a href="5-lt.html#SP3_1">&#167;3.1</a><br/>Rules - <a href="5-rls.html#SP8_1_5">&#167;8.1.5</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP4_1_2">&#167;4.1.2</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP9">&#167;9</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">&#167;4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1">&#167;4.1.1.1.1</a>, <a href="5-rsft.html#SP4_2">&#167;4.2</a>, <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a>, <a href="6-tm.html#SP3">&#167;3</a><br/>Timed Rules - <a href="6-tr.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a>, <a href="7-act.html#SP2">&#167;2</a><br/>Action Patterns - <a href="7-ap.html#SP5">&#167;5</a><br/>Parsing - <a href="8-prs.html#SP2">&#167;2</a><br/>Command Grammars - <a href="8-cg.html#SP7">&#167;7</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</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><a href="2-ea.html#SP11" class="function-link"><span class="function-syntax">EmitArrays::end_inner</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Packaging::exit</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

File diff suppressed because one or more lines are too long

View file

@ -98,7 +98,7 @@ reference points. But as newly-created packages they are initially empty.
<span class="plain-syntax"> </span><span class="identifier-syntax">Packaging::incarnate</span><span class="plain-syntax">(</span><span class="identifier-syntax">Packaging::get_unit</span><span class="plain-syntax">(</span><span class="identifier-syntax">main_emission_tree</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"synoptic"</span><span class="plain-syntax">)-&gt;</span><span class="identifier-syntax">the_package</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">main_emission_tree</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_tree</span><span class="plain-syntax"> *</span><span class="function-syntax">Emit::tree</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">Emit::tree</span></span>:<br/><a href="2-emt.html#SP4">&#167;4</a>, <a href="2-emt.html#SP5">&#167;5</a>, <a href="2-emt.html#SP7">&#167;7</a>, <a href="2-emt.html#SP8">&#167;8</a>, <a href="2-emt.html#SP9">&#167;9</a>, <a href="2-emt.html#SP10">&#167;10</a>, <a href="2-emt.html#SP11">&#167;11</a>, <a href="2-emt.html#SP12">&#167;12</a>, <a href="2-emt.html#SP14">&#167;14</a>, <a href="2-emt.html#SP15">&#167;15</a>, <a href="2-emt.html#SP16">&#167;16</a>, <a href="2-emt.html#SP17">&#167;17</a>, <a href="2-emt.html#SP19">&#167;19</a>, <a href="2-emt.html#SP22">&#167;22</a><br/>Hierarchy - <a href="2-hrr.html#SP1">&#167;1</a>, <a href="2-hrr.html#SP2">&#167;2</a>, <a href="2-hrr.html#SP9">&#167;9</a>, <a href="2-hrr.html#SP11">&#167;11</a>, <a href="2-hrr.html#SP12">&#167;12</a>, <a href="2-hrr.html#SP13">&#167;13</a>, <a href="2-hrr.html#SP14">&#167;14</a>, <a href="2-hrr.html#SP15">&#167;15</a>, <a href="2-hrr.html#SP16">&#167;16</a>, <a href="2-hrr.html#SP17">&#167;17</a>, <a href="2-hrr.html#SP18">&#167;18</a>, <a href="2-hrr.html#SP19">&#167;19</a>, <a href="2-hrr.html#SP20">&#167;20</a>, <a href="2-hrr.html#SP21">&#167;21</a>, <a href="2-hrr.html#SP22">&#167;22</a>, <a href="2-hrr.html#SP23">&#167;23</a><br/>Compilation Units - <a href="2-cu.html#SP2_1">&#167;2.1</a><br/>Emit Code - <a href="2-ec.html#SP2">&#167;2</a>, <a href="2-ec.html#SP3">&#167;3</a>, <a href="2-ec.html#SP4">&#167;4</a>, <a href="2-ec.html#SP5">&#167;5</a>, <a href="2-ec.html#SP7">&#167;7</a>, <a href="2-ec.html#SP8">&#167;8</a>, <a href="2-ec.html#SP9">&#167;9</a>, <a href="2-ec.html#SP10">&#167;10</a>, <a href="2-ec.html#SP11">&#167;11</a>, <a href="2-ec.html#SP12">&#167;12</a>, <a href="2-ec.html#SP13">&#167;13</a><br/>Emit Arrays - <a href="2-ea.html#SP4">&#167;4</a>, <a href="2-ea.html#SP6">&#167;6</a><br/>Enclosures - <a href="4-enc.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP7">&#167;7</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a>, <a href="5-rsfk.html#SP6">&#167;6</a>, <a href="5-rsfk.html#SP9">&#167;9</a>, <a href="5-rsfk.html#SP26">&#167;26</a><br/>Rules - <a href="5-rls.html#SP2">&#167;2</a><br/>Variables - <a href="5-vrb.html#SP1">&#167;1</a>, <a href="5-vrb.html#SP8">&#167;8</a><br/>Relations at Run Time - <a href="5-rart.html#SP18">&#167;18</a><br/>Command Grammars - <a href="8-cg.html#SP1">&#167;1</a><br/>Command Grammar Lines - <a href="8-cgl.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_tree</span><span class="plain-syntax"> *</span><span class="function-syntax">Emit::tree</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">Emit::tree</span></span>:<br/><a href="2-emt.html#SP4">&#167;4</a>, <a href="2-emt.html#SP5">&#167;5</a>, <a href="2-emt.html#SP7">&#167;7</a>, <a href="2-emt.html#SP8">&#167;8</a>, <a href="2-emt.html#SP9">&#167;9</a>, <a href="2-emt.html#SP10">&#167;10</a>, <a href="2-emt.html#SP11">&#167;11</a>, <a href="2-emt.html#SP12">&#167;12</a>, <a href="2-emt.html#SP14">&#167;14</a>, <a href="2-emt.html#SP15">&#167;15</a>, <a href="2-emt.html#SP16">&#167;16</a>, <a href="2-emt.html#SP17">&#167;17</a>, <a href="2-emt.html#SP19">&#167;19</a>, <a href="2-emt.html#SP22">&#167;22</a><br/>Hierarchy - <a href="2-hrr.html#SP1">&#167;1</a>, <a href="2-hrr.html#SP2">&#167;2</a>, <a href="2-hrr.html#SP9">&#167;9</a>, <a href="2-hrr.html#SP11">&#167;11</a>, <a href="2-hrr.html#SP12">&#167;12</a>, <a href="2-hrr.html#SP13">&#167;13</a>, <a href="2-hrr.html#SP14">&#167;14</a>, <a href="2-hrr.html#SP15">&#167;15</a>, <a href="2-hrr.html#SP16">&#167;16</a>, <a href="2-hrr.html#SP17">&#167;17</a>, <a href="2-hrr.html#SP18">&#167;18</a>, <a href="2-hrr.html#SP19">&#167;19</a>, <a href="2-hrr.html#SP20">&#167;20</a>, <a href="2-hrr.html#SP21">&#167;21</a>, <a href="2-hrr.html#SP22">&#167;22</a>, <a href="2-hrr.html#SP23">&#167;23</a><br/>Compilation Units - <a href="2-cu.html#SP2_1">&#167;2.1</a><br/>Emit Code - <a href="2-ec.html#SP2">&#167;2</a>, <a href="2-ec.html#SP3">&#167;3</a>, <a href="2-ec.html#SP4">&#167;4</a>, <a href="2-ec.html#SP5">&#167;5</a>, <a href="2-ec.html#SP7">&#167;7</a>, <a href="2-ec.html#SP8">&#167;8</a>, <a href="2-ec.html#SP9">&#167;9</a>, <a href="2-ec.html#SP10">&#167;10</a>, <a href="2-ec.html#SP11">&#167;11</a>, <a href="2-ec.html#SP12">&#167;12</a>, <a href="2-ec.html#SP13">&#167;13</a><br/>Emit Arrays - <a href="2-ea.html#SP4">&#167;4</a>, <a href="2-ea.html#SP6">&#167;6</a><br/>Enclosures - <a href="4-enc.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP7_4">&#167;7.4</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a>, <a href="5-rsfk.html#SP6">&#167;6</a>, <a href="5-rsfk.html#SP9">&#167;9</a>, <a href="5-rsfk.html#SP26">&#167;26</a><br/>Rules - <a href="5-rls.html#SP2">&#167;2</a><br/>Variables - <a href="5-vrb.html#SP1">&#167;1</a>, <a href="5-vrb.html#SP8">&#167;8</a><br/>Relations at Run Time - <a href="5-rart.html#SP18">&#167;18</a><br/>Command Grammars - <a href="8-cg.html#SP1">&#167;1</a><br/>Command Grammar Lines - <a href="8-cgl.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">main_emission_tree</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -110,7 +110,7 @@ reference points. But as newly-created packages they are initially empty.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">InterTree::warehouse</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_bookmark</span><span class="plain-syntax"> *</span><span class="function-syntax">Emit::at</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">Emit::at</span></span>:<br/><a href="2-emt.html#SP3">&#167;3</a>, <a href="2-emt.html#SP6">&#167;6</a>, <a href="2-emt.html#SP7">&#167;7</a>, <a href="2-emt.html#SP9">&#167;9</a>, <a href="2-emt.html#SP10">&#167;10</a>, <a href="2-emt.html#SP11">&#167;11</a>, <a href="2-emt.html#SP14">&#167;14</a>, <a href="2-emt.html#SP15">&#167;15</a>, <a href="2-emt.html#SP16">&#167;16</a>, <a href="2-emt.html#SP17">&#167;17</a>, <a href="2-emt.html#SP18">&#167;18</a>, <a href="2-emt.html#SP19">&#167;19</a>, <a href="2-emt.html#SP20">&#167;20</a>, <a href="2-emt.html#SP21">&#167;21</a>, <a href="2-emt.html#SP22">&#167;22</a><br/>Emit Arrays - <a href="2-ea.html#SP11">&#167;11</a><br/>Text Substitutions - <a href="4-ts.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="identifier-syntax">inter_bookmark</span><span class="plain-syntax"> *</span><span class="function-syntax">Emit::at</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">Emit::at</span></span>:<br/><a href="2-emt.html#SP3">&#167;3</a>, <a href="2-emt.html#SP6">&#167;6</a>, <a href="2-emt.html#SP7">&#167;7</a>, <a href="2-emt.html#SP9">&#167;9</a>, <a href="2-emt.html#SP10">&#167;10</a>, <a href="2-emt.html#SP11">&#167;11</a>, <a href="2-emt.html#SP14">&#167;14</a>, <a href="2-emt.html#SP15">&#167;15</a>, <a href="2-emt.html#SP16">&#167;16</a>, <a href="2-emt.html#SP17">&#167;17</a>, <a href="2-emt.html#SP18">&#167;18</a>, <a href="2-emt.html#SP19">&#167;19</a>, <a href="2-emt.html#SP20">&#167;20</a>, <a href="2-emt.html#SP21">&#167;21</a>, <a href="2-emt.html#SP22">&#167;22</a><br/>Emit Arrays - <a href="2-ea.html#SP11">&#167;11</a><br/>Text Substitutions - <a href="4-ts.html#SP7_4">&#167;7.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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Packaging::at</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax">}</span>
@ -140,7 +140,7 @@ of <span class="extract"><span class="extract-syntax">inter_ti</span></span> var
</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">Emit::holster_iname</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">Emit::holster_iname</span></span>:<br/>Text Substitutions - <a href="4-ts.html#SP2_2">&#167;2.2</a><br/>Responses - <a href="4-rsp.html#SP11">&#167;11</a>, <a href="4-rsp.html#SP11_1_2">&#167;11.1.2</a><br/>Box Quotations - <a href="4-bq.html#SP1">&#167;1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a><br/>Actions - <a href="7-act.html#SP5">&#167;5</a><br/>Action Patterns - <a href="7-ap.html#SP5">&#167;5</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">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Emit::holster_iname</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">Emit::holster_iname</span></span>:<br/>Text Substitutions - <a href="4-ts.html#SP2_2">&#167;2.2</a><br/>Box Quotations - <a href="4-bq.html#SP1">&#167;1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a><br/>Actions - <a href="7-act.html#SP5">&#167;5</a><br/>Action Patterns - <a href="7-ap.html#SP5">&#167;5</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">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::non_void_context</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">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP3" class="function-link"><span class="function-syntax">Emit::to_value_pair</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>

File diff suppressed because one or more lines are too long

View file

@ -72,128 +72,223 @@ 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: Enclosed Resources</a></li><li><b>Responses</b></li></ul></div>
<p class="purpose">In this section we keep track of response texts.</p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>Responses are texts &mdash; which may be either literals or text substitutions &mdash;
<ul class="toc"><li><a href="4-rsp.html#SP1">&#167;1. Introduction</a></li><li><a href="4-rsp.html#SP4">&#167;4. How rules gain responses</a></li><li><a href="4-rsp.html#SP6">&#167;6. Compilation</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Introduction. </b>Responses are texts &mdash; which may be either literals or text substitutions &mdash;
occurring inside the body of rules, and marked out (A), (B), (C), ... within
that rule. This enables them to be manipulated or changed.
that rule. This enables them to be manipulated or changed. For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">Report</span><span class="plain-syntax"> </span><span class="identifier-syntax">an</span><span class="plain-syntax"> </span><span class="identifier-syntax">actor</span><span class="plain-syntax"> </span><span class="identifier-syntax">taking</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">the</span><span class="plain-syntax"> </span><span class="identifier-syntax">standard</span><span class="plain-syntax"> </span><span class="identifier-syntax">report</span><span class="plain-syntax"> </span><span class="identifier-syntax">taking</span><span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax">):</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">if</span><span class="plain-syntax"> </span><span class="identifier-syntax">the</span><span class="plain-syntax"> </span><span class="identifier-syntax">action</span><span class="plain-syntax"> </span><span class="identifier-syntax">is</span><span class="plain-syntax"> </span><span class="identifier-syntax">not</span><span class="plain-syntax"> </span><span class="identifier-syntax">silent</span><span class="plain-syntax">:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">if</span><span class="plain-syntax"> </span><span class="identifier-syntax">the</span><span class="plain-syntax"> </span><span class="identifier-syntax">actor</span><span class="plain-syntax"> </span><span class="identifier-syntax">is</span><span class="plain-syntax"> </span><span class="identifier-syntax">the</span><span class="plain-syntax"> </span><span class="identifier-syntax">player</span><span class="plain-syntax">:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say</span><span class="plain-syntax"> </span><span class="string-syntax">"Taken."</span><span class="plain-syntax"> (</span><span class="identifier-syntax">A</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">otherwise</span><span class="plain-syntax">:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say</span><span class="plain-syntax"> </span><span class="string-syntax">"[The actor] [pick] up [the noun]."</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax">).</span>
</pre>
<p class="commentary">In effect there is a two-element array attached to this rule, one holding
the current response (A), the other (B). These are identified by an index called
the "marker", which counts from 0: so (A) is 0, (B) is 1.
</p>
<p class="commentary">Those original appearances inside the rule are called the "cues". The texts are
stored as <a href="4-ts.html" class="internal">Text Substitutions</a>, even if, as in example (A) here, they do not
actually involve any substituting. (It's simpler to have a common format, and in
any case these are the exception.) All of the difficulties attendant on text
substitutions apply here, too. Note, for example, that (B) refers to the "actor",
a shared variable which is not normally visible from here:
</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">grab</span><span class="plain-syntax"> </span><span class="identifier-syntax">is</span><span class="plain-syntax"> </span><span class="identifier-syntax">a</span><span class="plain-syntax"> </span><span class="identifier-syntax">verb</span><span class="plain-syntax">.</span>
<span class="identifier-syntax">When</span><span class="plain-syntax"> </span><span class="identifier-syntax">play</span><span class="plain-syntax"> </span><span class="identifier-syntax">begins</span><span class="plain-syntax">:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">now</span><span class="plain-syntax"> </span><span class="identifier-syntax">the</span><span class="plain-syntax"> </span><span class="identifier-syntax">standard</span><span class="plain-syntax"> </span><span class="identifier-syntax">report</span><span class="plain-syntax"> </span><span class="identifier-syntax">taking</span><span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> </span><span class="identifier-syntax">response</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax">) </span><span class="identifier-syntax">is</span><span class="plain-syntax"> </span><span class="string-syntax">"[The actor] [grab] [the noun]."</span>
</pre>
<p class="commentary">Here, "actor" has to be read in the context of the standard report taking rule's
stack frame, not in the stack for the "when play begins" rule.
</p>
<p class="commentary">Each time a cue is found, a <span class="extract"><span class="extract-syntax">response_message</span></span> object is created, as follows:
</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">response_message</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">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">responding_rule</span><span class="plain-syntax">; </span><span class="comment-syntax"> named rule in which this response occurs</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">response_marker</span><span class="plain-syntax">; </span><span class="comment-syntax"> 0 for A, 1 for B, and so on up</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">original_text</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">the_rule</span><span class="plain-syntax">; </span><span class="comment-syntax"> to which this is a response</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">the_marker</span><span class="plain-syntax">; </span><span class="comment-syntax"> 0 for A, 1 for B, and so on up</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">the_ts</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">original_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">constant_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp_package</span><span class="plain-syntax">;</span>
<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">launcher_iname</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">launcher_compiled</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">via_I6</span><span class="plain-syntax">; </span><span class="comment-syntax"> if responding to a rule defined by I6 code, not source text</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">via_I6_routine_compiled</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">via_Inter</span><span class="plain-syntax">; </span><span class="comment-syntax"> if responding to a rule defined by Inter code, not source text</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">via_Inter_routine_compiled</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">response_message</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure response_message is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Continuing with our naming convention for text resources at runtime, here
is the "launcher" routine for a response:
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Note that each response has its own package, which is stored inside the package
of the rule to which it responds.
</p>
<p class="commentary">It occasionally happens that assertion sentences have changed the wording of a
response long before any code is compiled, and therefore before this call,
through a sentence like:
</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">Responses::response_launcher_iname</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">Responses::response_launcher_iname</span></span>:<br/><a href="4-rsp.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">resp_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">The</span><span class="plain-syntax"> </span><span class="identifier-syntax">print</span><span class="plain-syntax"> </span><span class="identifier-syntax">empty</span><span class="plain-syntax"> </span><span class="identifier-syntax">inventory</span><span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> </span><span class="identifier-syntax">response</span><span class="plain-syntax"> (</span><span class="identifier-syntax">A</span><span class="plain-syntax">) </span><span class="identifier-syntax">is</span><span class="plain-syntax"> </span><span class="string-syntax">"I got nothing."</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>Each response is itself a value at run-time, and the following compiles
its name in the output code:
<p class="commentary">This would cause <span class="extract"><span class="extract-syntax">RW</span></span>, the replacement wording, below to be <span class="extract"><span class="extract-syntax">"I got nothing."</span></span>.
</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">Responses::response_constant_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">Responses::response_constant_iname</span></span>:<br/><a href="4-rsp.html#SP5_1">&#167;5.1</a>, <a href="4-rsp.html#SP6_1">&#167;6.1</a>, <a href="4-rsp.html#SP6_2">&#167;6.2</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><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">RM</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rules::get_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">RM</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">RM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constant_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no response value"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">RM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constant_iname</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>The following is called in response to a usage of a text followed by a
response marker; for example,
</p>
<blockquote>
<p>say "You can't open [the noun]." (A);</p>
</blockquote>
<p class="commentary">We compile it as the name of the response's "launcher" routine; that is, as
the launcher for response (A) of the rule currently being compiled.
</p>
<p class="commentary">The original text, <span class="extract"><span class="extract-syntax">"You can't open [the noun]."</span></span> is then remembered as if
it were a text substitution &mdash; as of course it is, but it may be supplanted
at run-time, or even before that. (For simplicity we choose to treat the text
as a substitution even if, in fact, it's just literal text.) All of the
problems usually attendant on text substitutions apply here, too; we
need to remember the stack frame for later.
</p>
<p class="commentary">Thus the above source text will produce not only a <span class="extract"><span class="extract-syntax">TX_R_*</span></span> launcher routine,
but also (in most cases) a <span class="extract"><span class="extract-syntax">TX_S_*</span></span> text substitution routine.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="function-syntax">Responses::response_cue</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Responses::response_cue</span></span>:<br/><a href="4-rsp.html#SP11_1_1">&#167;11.1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owner</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">via_I6</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="function-syntax">Responses::response_cue</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">Responses::response_cue</span></span>:<br/><a href="4-rsp.html#SP4">&#167;4</a>, <a href="4-rsp.html#SP5">&#167;5</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><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">response_message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">original_stack_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::boxed_frame</span><span class="plain-syntax">(</span><span class="identifier-syntax">frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">responding_rule</span><span class="plain-syntax"> = </span><span class="identifier-syntax">owner</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">response_marker</span><span class="plain-syntax"> = </span><span class="identifier-syntax">marker</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">original_text</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP5" class="function-link"><span class="function-syntax">TextSubstitutions::new_text_substitution</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">owner</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">original_stack_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">the_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">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">the_marker</span><span class="plain-syntax"> = </span><span class="identifier-syntax">marker</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">launcher_compiled</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">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">via_I6</span><span class="plain-syntax"> = </span><span class="identifier-syntax">via_I6</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">via_I6_routine_compiled</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">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">resp_package</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP21" class="function-link"><span class="function-syntax">Hierarchy::package_within</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RESPONSES_HAP</span><span class="plain-syntax">, </span><a href="5-rls.html#SP2" class="function-link"><span class="function-syntax">RTRules::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_rule</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">resp_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AS_BLOCK_CONSTANT_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">resp_package</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">constant_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AS_CONSTANT_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">resp_package</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VH</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::non_void_context</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><a href="4-rsp.html#SP2" class="function-link"><span class="function-syntax">Responses::response_launcher_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</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">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">via_Inter</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">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">via_Inter_routine_compiled</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">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PR</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP21" class="function-link"><span class="function-syntax">Hierarchy::package_within</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RESPONSES_HAP</span><span class="plain-syntax">, </span><a href="5-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="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">constant_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AS_CONSTANT_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="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AS_BLOCK_CONSTANT_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="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">launcher_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LAUNCHER_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="identifier-syntax">Rules::set_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</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">RW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rules::get_response_replacement_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span 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">RW</span><span class="plain-syntax">)) </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RW</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">the_ts</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP5" class="function-link"><span class="function-syntax">TextSubstitutions::new_text_substitution</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-ts.html#SP4" class="function-link"><span class="function-syntax">TextSubstitutions::value_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_ts</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>Response launchers can be compiled in sets, but not quite all at once.
The following code is quadratic in the number of responses, but it really
doesn't matter, since so little is done and the response count can't be
enormous.
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>Some access functions:
</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">Responses::compile_response_launchers</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">Responses::compile_response_launchers</span></span>:<br/>Text Substitutions - <a href="4-ts.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Responses::response_launcher_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">Responses::response_launcher_iname</span></span>:<br/><a href="4-rsp.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">value_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Responses::response_constant_iname</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">Responses::response_constant_iname</span></span>:<br/><a href="4-rsp.html#SP6_1">&#167;6.1</a>, <a href="4-rsp.html#SP7_1">&#167;7.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><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rules::get_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constant_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no response value"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constant_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Responses::frame_for_response</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">Responses::frame_for_response</span></span>:<br/>Text Substitutions - <a href="4-ts.html#SP7_1">&#167;7.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><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rules::get_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">original_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. How rules gain responses. </b>There are two ways a rule can get a new response. Firstly, and the way most
Inform authors do it:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">say</span><span class="plain-syntax"> </span><span class="string-syntax">"[The actor] [pick] up [the noun]."</span><span class="plain-syntax"> (</span><span class="identifier-syntax">B</span><span class="plain-syntax">).</span>
</pre>
<p class="commentary">Will cause <a href="4-rsp.html#SP4" class="internal">Responses::set_via_source_text</a> to be called. This compiles Inter
code suitable for the response to be called (i.e., printed), setting up the cue
and attaching it to its rule in the process.
</p>
<p class="commentary">Note the use of <a href="../imperative-module/3-lp.html" class="internal">Local Parking (in imperative)</a> to stash local values before the
evaluation: and see <a href="4-ts.html#SP7" class="internal">TextSubstitutions::compile_function</a> for where those are
retrieved.
</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">Responses::set_via_source_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">SW</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">downs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalParking::park</span><span class="plain-syntax">(</span><span class="identifier-syntax">frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="4-rsp.html#SP2" class="function-link"><span class="function-syntax">Responses::response_cue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">SW</span><span class="plain-syntax">, </span><span class="identifier-syntax">Frames::boxed_frame</span><span class="plain-syntax">(</span><span class="identifier-syntax">frame</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><a href="4-rsp.html#SP3" class="function-link"><span class="function-syntax">Responses::response_launcher_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">downs</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">(); </span><span class="identifier-syntax">downs</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>Secondly, a lower-level technique used by extensions to give responses even
to rules defined in Inter kits rather than by source text:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">The</span><span class="plain-syntax"> </span><span class="identifier-syntax">requested</span><span class="plain-syntax"> </span><span class="identifier-syntax">actions</span><span class="plain-syntax"> </span><span class="identifier-syntax">require</span><span class="plain-syntax"> </span><span class="identifier-syntax">persuasion</span><span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> </span><span class="identifier-syntax">translates</span><span class="plain-syntax"> </span><span class="identifier-syntax">into</span><span class="plain-syntax"> </span><span class="identifier-syntax">Inter</span><span class="plain-syntax"> </span><span class="identifier-syntax">as</span>
<span class="plain-syntax"> </span><span class="string-syntax">"REQUESTED_ACTIONS_REQUIRE_R"</span><span class="plain-syntax"> </span><span class="identifier-syntax">with</span>
<span class="plain-syntax"> </span><span class="string-syntax">"[The noun] [have] better things to do."</span><span class="plain-syntax"> (</span><span class="identifier-syntax">A</span><span class="plain-syntax">).</span>
</pre>
<p class="commentary">Which causes the following to be called:
</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">Responses::set_via_translation</span><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">SW</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><a href="4-rsp.html#SP2" class="function-link"><span class="function-syntax">Responses::response_cue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">SW</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">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">via_Inter</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Compilation. </b>Values and launchers for responses are then compiled in due course by the
following coroutine (see <a href="../core-module/1-htc.html" class="internal">How To Compile (in core)</a>):
</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">Responses::compilation_coroutine</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">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">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">, </span><span class="reserved-syntax">response_message</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">launcher_compiled</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">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">launcher_compiled</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="4-rsp.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Compile the actual launcher</span><span class="named-paragraph-number">5.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><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">via_I6</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">via_I6_routine_compiled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">If the response is via I6, compile the necessary routine for this rule</span><span class="named-paragraph-number">5.2</span></a></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="named-paragraph-container code-font"><a href="4-rsp.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Compile resources needed by this response</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">via_Inter</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">via_Inter_routine_compiled</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">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">r2</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">r2</span><span class="plain-syntax">, </span><span class="reserved-syntax">response_message</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax"> == </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">via_Inter_routine_compiled</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">N</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP6_2" class="named-paragraph-link"><span class="named-paragraph">Compile the response-handler function for this rule</span><span class="named-paragraph-number">6.2</span></a></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">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="SP5_1" class="paragraph-anchor"></a><b>&#167;5.1. </b>Each response is itself a value, and the launcher routine consists only of
a call to an activity based on that value:
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the actual launcher</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>&#167;6.1. </b>Each response compiles to a text value like so:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">resp_package</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">launcher</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LAUNCHER_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> small block:</span>
<span class="plain-syntax"> value ----------------&gt; CONSTANT_PACKED_TEXT_STORAGE</span>
<span class="plain-syntax"> launcher function ----------------------&gt; ...</span>
</pre>
<p class="commentary">Thus, printing this value at runtime calls the launcher function. This in
turn runs the "issuing the response text" activity, though it does it via
a function defined in <a href="../BasicInformKit/index.html" class="internal">BasicInformKit</a>.
</p>
<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">Functions::begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">launcher</span><span class="plain-syntax">);</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile resources needed by this response</span><span class="named-paragraph-number">6.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_ts</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">ts_value_iname</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP4" class="function-link"><span class="function-syntax">TextSubstitutions::value_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rc_iname</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="4-rsp.html#SP3" class="function-link"><span class="function-syntax">Responses::response_constant_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP19" class="function-link"><span class="function-syntax">Emit::response</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rc_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">ts_value_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-tl.html#SP1" class="function-link"><span class="function-syntax">TextLiterals::compile_value_to</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">value_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">launcher_iname</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">Functions::begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">launcher_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="4-rsp.html#SP3" class="function-link"><span class="function-syntax">Responses::response_constant_iname</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">response_marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_marker</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">rname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RESPONSEVIAACTIVITY_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP10" class="function-link"><span class="function-syntax">EmitCode::call</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rname</span><span class="plain-syntax">);</span>
@ -202,24 +297,17 @@ a call to an activity based on that value:
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::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">save</span><span class="plain-syntax"> = </span><a href="2-ea.html#SP2" class="function-link"><span class="function-syntax">EmitArrays::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">resp_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">CONSTANT_PACKED_TEXT_STORAGE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">launcher</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP6" class="function-link"><span class="function-syntax">EmitArrays::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5_2" class="paragraph-anchor"></a><b>&#167;5.2. </b>Something skated over above is that responses can also be created when the
source text defines a rule only as an I6 routine. For example:
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_2" class="paragraph-anchor"></a><b>&#167;6.2. </b>Something skated over above is that responses can also be created when the
source text defines a rule only as an Inter routine. For example:
</p>
<blockquote>
<p>The hack mode rule translates into I6 as "HACK_MODE_ON_R" with "Hack mode on." (A).</p>
</blockquote>
<p class="commentary">Responses like this one are "via I6", and they cause us to create a support
routine for the rule, called in this case <span class="extract"><span class="extract-syntax">HACK_MODE_ON_RM</span></span>. The rule then
calls
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">The</span><span class="plain-syntax"> </span><span class="identifier-syntax">hack</span><span class="plain-syntax"> </span><span class="identifier-syntax">mode</span><span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> </span><span class="identifier-syntax">translates</span><span class="plain-syntax"> </span><span class="identifier-syntax">into</span><span class="plain-syntax"> </span><span class="identifier-syntax">Inter</span><span class="plain-syntax"> </span><span class="identifier-syntax">as</span><span class="plain-syntax"> </span><span class="string-syntax">"HACK_MODE_ON_R"</span><span class="plain-syntax"> </span><span class="identifier-syntax">with</span><span class="plain-syntax"> </span><span class="string-syntax">"Hack mode on."</span><span class="plain-syntax"> (</span><span class="identifier-syntax">A</span><span class="plain-syntax">).</span>
</pre>
<p class="commentary">Responses like this one are "via Inter", and they cause us to create a handler
function for the rule, called (say) <span class="extract"><span class="extract-syntax">HACK_MODE_ON_RM</span></span>. The rule then calls:
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -231,15 +319,16 @@ calls
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">HACK_MODE_ON_RM</span><span class="plain-syntax">(</span><span class="character-syntax">'a'</span><span class="plain-syntax">);</span>
</pre>
<p class="commentary">to return the current text of (A) without printing it. Speed is not of the
essence here.
<p class="commentary">to return the current text of (A) without printing it. Speed is not of the essence;
and note that the response-handler is created in the package for the rule to which
it responds.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">If the response is via I6, compile the necessary routine for this rule</span><span class="named-paragraph-number">5.2</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the response-handler function for this rule</span><span class="named-paragraph-number">6.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">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">responder_iname</span><span class="plain-syntax"> = </span><a href="5-rls.html#SP2" class="function-link"><span class="function-syntax">RTRules::get_handler_definition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_rule</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">responder_iname</span><span class="plain-syntax"> = </span><a href="5-rls.html#SP2" class="function-link"><span class="function-syntax">RTRules::get_handler_definition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</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">Functions::begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">responder_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">code_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalVariables::new_other_as_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"code"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalVariables::new_other_as_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"val"</span><span class="plain-syntax">);</span>
@ -322,20 +411,19 @@ essence here.
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">r2</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">r2</span><span class="plain-syntax">, </span><span class="reserved-syntax">response_message</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_rule</span><span class="plain-syntax"> == </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_rule</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax"> == </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP10" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">CASE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="character-syntax">'A'</span><span class="plain-syntax"> + </span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">response_marker</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="character-syntax">'A'</span><span class="plain-syntax"> + </span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_marker</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP5" class="function-link"><span class="function-syntax">EmitCode::code</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP10" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP9" class="function-link"><span class="function-syntax">EmitCode::ref_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">str_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">resp_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">value_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">via_I6_routine_compiled</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="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
@ -384,55 +472,22 @@ essence here.
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>So much for the launchers. We also have to compile the response values,
and some run-time tables which will enable the I6 template code to keep
track of the content of each response.
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>There's then one function and one array left to compile:
</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">Responses::compile_responses</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Compile the array holding the current text of each response</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP6_2" class="named-paragraph-link"><span class="named-paragraph">Compile the PrintResponse routine</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="4-rsp.html#SP6_3" class="named-paragraph-link"><span class="named-paragraph">Compile the Response Divisions array</span><span class="named-paragraph-number">6.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="4-ts.html#SP8" class="function-link"><span class="function-syntax">TextSubstitutions::compile_text_routines_in_response_mode</span></a><span class="plain-syntax">();</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Responses::compile_synoptic_resources</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Compile the PrintResponse routine</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP7_2" class="named-paragraph-link"><span class="named-paragraph">Compile the Response Divisions array</span><span class="named-paragraph-number">7.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>&#167;6.1. </b>Note that each rule is allowed to tell us that it already has a better
text for the response than the one we first created.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the array holding the current text of each response</span><span class="named-paragraph-number">6.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</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">marker</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">marker</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">marker</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">26</span><span class="plain-syntax">; </span><span class="identifier-syntax">marker</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rules::get_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">original_text</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">Rules::get_response_content</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span 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="comment-syntax"> i.e., if the rule gives us a better text</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rules::get_response_sentence</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP5" class="function-link"><span class="function-syntax">TextSubstitutions::new_text_substitution</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">original_text</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tr_done_already</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts_value_iname</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP4" class="function-link"><span class="function-syntax">TextSubstitutions::value_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rc_iname</span><span class="plain-syntax"> = </span><a href="4-rsp.html#SP3" class="function-link"><span class="function-syntax">Responses::response_constant_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP19" class="function-link"><span class="function-syntax">Emit::response</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rc_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">ts_value_iname</span><span class="plain-syntax">);</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="4-rsp.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_2" class="paragraph-anchor"></a><b>&#167;6.2. </b>This is in effect a big switch statement, so it's not fast; but as usual
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b>This is in effect a big switch statement, so it's not fast; but as usual
with printing routines it really doesn't need to be. Given a response value,
say <span class="extract"><span class="extract-syntax">R_14_RESP_B</span></span>, we print its current text, say response (B) for <span class="extract"><span class="extract-syntax">R_14</span></span>.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the PrintResponse routine</span><span class="named-paragraph-number">6.2</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the PrintResponse routine</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -441,8 +496,8 @@ say <span class="extract"><span class="extract-syntax">R_14_RESP_B</span></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalVariables::new_other_as_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"R"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">, </span><span class="reserved-syntax">response_message</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="4-rsp.html#SP3" class="function-link"><span class="function-syntax">Responses::response_constant_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_rule</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">response_marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="4-rsp.html#SP3" class="function-link"><span class="function-syntax">Responses::response_constant_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP10" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">IF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP10" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">EQ_BIP</span><span class="plain-syntax">);</span>
@ -454,7 +509,7 @@ say <span class="extract"><span class="extract-syntax">R_14_RESP_B</span></span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP10" class="function-link"><span class="function-syntax">EmitCode::call</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RULEPRINTINGRULE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><a href="5-rls.html#SP2" class="function-link"><span class="function-syntax">RTRules::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_rule</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><a href="5-rls.html#SP2" class="function-link"><span class="function-syntax">RTRules::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP10" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PRINT_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
@ -462,7 +517,7 @@ say <span class="extract"><span class="extract-syntax">R_14_RESP_B</span></span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP10" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PRINTCHAR_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="character-syntax">'A'</span><span class="plain-syntax"> + </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">response_marker</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="character-syntax">'A'</span><span class="plain-syntax"> + </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_marker</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP10" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PRINT_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
@ -473,30 +528,30 @@ say <span class="extract"><span class="extract-syntax">R_14_RESP_B</span></span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_3" class="paragraph-anchor"></a><b>&#167;6.3. </b>The following array is used only by the testing command RESPONSES, and
enables the I6 template to print out all known responses at run-time,
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>&#167;7.2. </b>The following array is used only by the testing command RESPONSES, and
enables the Inter template to print out all known responses at run-time,
divided up by the extensions containing the rules which produce them.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the Response Divisions array</span><span class="named-paragraph-number">6.3</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the Response Divisions array</span><span class="named-paragraph-number">7.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<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#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RESPONSEDIVISIONS_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="2-ea.html#SP2" class="function-link"><span class="function-syntax">EmitArrays::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="identifier-syntax">group_E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP6_3_1" class="named-paragraph-link"><span class="named-paragraph">Make a ResponseDivisions entry</span><span class="named-paragraph-number">6.3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP7_2_1" class="named-paragraph-link"><span class="named-paragraph">Make a ResponseDivisions entry</span><span class="named-paragraph-number">7.2.1</span></a></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">group_E</span><span class="plain-syntax">, </span><span class="identifier-syntax">inform_extension</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP6_3_1" class="named-paragraph-link"><span class="named-paragraph">Make a ResponseDivisions entry</span><span class="named-paragraph-number">6.3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP7_2_1" class="named-paragraph-link"><span class="named-paragraph">Make a ResponseDivisions entry</span><span class="named-paragraph-number">7.2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP6" class="function-link"><span class="function-syntax">EmitArrays::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#SP17" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_3_1" class="paragraph-anchor"></a><b>&#167;6.3.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make a ResponseDivisions entry</span><span class="named-paragraph-number">6.3.1</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_2_1" class="paragraph-anchor"></a><b>&#167;7.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make a ResponseDivisions entry</span><span class="named-paragraph-number">7.2.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -508,13 +563,13 @@ divided up by the extensions containing the rules which produce them.
<span class="plain-syntax"> </span><span class="identifier-syntax">tally</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Extensions::corresponding_to</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Lexer::file_of_origin</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">E</span><span class="plain-syntax"> == </span><span class="identifier-syntax">group_E</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP6_3_1_1" class="named-paragraph-link"><span class="named-paragraph">Start a possible run of matches</span><span class="named-paragraph-number">6.3.1.1</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="4-rsp.html#SP6_3_1_2" class="named-paragraph-link"><span class="named-paragraph">End a possible run of matches</span><span class="named-paragraph-number">6.3.1.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">E</span><span class="plain-syntax"> == </span><span class="identifier-syntax">group_E</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP7_2_1_1" class="named-paragraph-link"><span class="named-paragraph">Start a possible run of matches</span><span class="named-paragraph-number">7.2.1.1</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="4-rsp.html#SP7_2_1_2" class="named-paragraph-link"><span class="named-paragraph">End a possible run of matches</span><span class="named-paragraph-number">7.2.1.2</span></a></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="4-rsp.html#SP6_3_1_2" class="named-paragraph-link"><span class="named-paragraph">End a possible run of matches</span><span class="named-paragraph-number">6.3.1.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP7_2_1_2" class="named-paragraph-link"><span class="named-paragraph">End a possible run of matches</span><span class="named-paragraph-number">7.2.1.2</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP6_3">&#167;6.3</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP6_3_1_1" class="paragraph-anchor"></a><b>&#167;6.3.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Start a possible run of matches</span><span class="named-paragraph-number">6.3.1.1</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP7_2">&#167;7.2</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP7_2_1_1" class="paragraph-anchor"></a><b>&#167;7.2.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Start a possible run of matches</span><span class="named-paragraph-number">7.2.1.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -530,8 +585,8 @@ divided up by the extensions containing the rules which produce them.
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::numeric_entry</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">tally</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP6_3_1">&#167;6.3.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_3_1_2" class="paragraph-anchor"></a><b>&#167;6.3.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">End a possible run of matches</span><span class="named-paragraph-number">6.3.1.2</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP7_2_1">&#167;7.2.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_2_1_2" class="paragraph-anchor"></a><b>&#167;7.2.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">End a possible run of matches</span><span class="named-paragraph-number">7.2.1.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -540,170 +595,7 @@ divided up by the extensions containing the rules which produce them.
<span class="plain-syntax"> </span><span class="identifier-syntax">contiguous_match</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP6_3_1">&#167;6.3.1</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Responses::frame_for_response</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Responses::frame_for_response</span></span>:<br/>Text Substitutions - <a href="4-ts.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">original_stack_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>As mentioned above, assertions in the source text can change the text of
a given response even at compile time. But the rules code looks after that:
</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">Responses::assert_response_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">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">Rules::now_rule_needs_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</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>When we index a response, we also provide a paste button for the source
text to assert a change:
</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">Responses::index_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="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>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN_WITH</span><span class="plain-syntax">(</span><span class="string-syntax">"span"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"style=\"color: #ffffff; "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"font-family: 'Courier New', Courier, monospace; background-color: #8080ff;\""</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;%c&amp;nbsp;&amp;nbsp; "</span><span class="plain-syntax">, </span><span class="character-syntax">'A'</span><span class="plain-syntax"> + </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"span"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN_WITH</span><span class="plain-syntax">(</span><span class="string-syntax">"span"</span><span class="plain-syntax">, </span><span class="string-syntax">"style=\"color: #000066;\""</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">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">original_text</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unsubstituted_text</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">"span"</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;"</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">S</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">S</span><span class="plain-syntax">, </span><span class="string-syntax">"%+W response (%c)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">, </span><span class="character-syntax">'A'</span><span class="plain-syntax"> + </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PasteButtons::paste_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</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;&lt;i&gt;name&lt;/i&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">"&amp;nbsp;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</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">S</span><span class="plain-syntax">, </span><span class="string-syntax">"The %+W response (%c) is \"New text.\"."</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">S</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;&lt;i&gt;set&lt;/i&gt;"</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">S</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></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">Responses::get_marker_from_response_spec</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_CONSTANT_of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">rs</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_response</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">SW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">2</span><span class="plain-syntax">) &amp;&amp; (</span><span class="function-syntax">&lt;response-letter&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">)-1))))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</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">return</span><span class="plain-syntax"> -1;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>To complete the code on strings, we just need the top-level routine which
handles the compilation of a general string literal. There are actually three
ways we might not even be compiling an I7 text value here:
</p>
<ul class="items"><li>(a) If the specification is flagged "explicit", we're using this as a device
to hold low-level I6 property values such as <span class="extract"><span class="extract-syntax">parse_name</span></span> routines, and we
simply compile the text raw.
</li><li>(b) If we're in quotation mode, that means the text is destined to be in an
I6 "box" statement, which needs it to be formed in an eccentric way.
</li><li>(c) If we're in bibliographic mode, we're compiling not to the I6 program
but to something like an XML description of its metadata, where again the
text needs to be printed in a particular way.
</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">Responses::compile_general</span><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">str</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">SW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</span><span class="plain-syntax">, </span><span class="identifier-syntax">explicit_literal_ANNOT</span><span 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_explicit_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::non_void_context</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::holster_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_explicit_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</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">"unvalued SCG"</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">A</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</span><span class="plain-syntax">, </span><span class="identifier-syntax">constant_number_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::non_void_context</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">Holsters::holster_pair</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">A</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="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">SW</span><span class="plain-syntax">)) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Text no longer available for CONSTANT/TEXT"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP11_1" class="named-paragraph-link"><span class="named-paragraph">This is going to make a valid I7 text value</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>Responses take the form
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> "blah blah blah" ( letter )</span>
</pre>
<p class="commentary">so the penultimate word, if it's there, is the letter.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">This is going to make a valid I7 text value</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">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">2</span><span class="plain-syntax">) &amp;&amp; (</span><span class="function-syntax">&lt;response-letter&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">)-1))))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP11_1_1" class="named-paragraph-link"><span class="named-paragraph">This is a response</span><span class="named-paragraph-number">11.1.1</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="4-rsp.html#SP11_1_2" class="named-paragraph-link"><span class="named-paragraph">This isn't a response</span><span class="named-paragraph-number">11.1.2</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP11">&#167;11</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11_1_1" class="paragraph-anchor"></a><b>&#167;11.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">This is a response</span><span class="named-paragraph-number">11.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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">code</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="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">rule_being_compiled</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">Rules::rule_allows_responses</span><span class="plain-syntax">(</span><span class="identifier-syntax">rule_being_compiled</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">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_ResponseContextWrong</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"lettered responses can only be used in named rules"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"not in any of the other contexts in which quoted text can appear."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Rules::get_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">rule_being_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">code</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_ResponseDuplicated</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this duplicates a response letter"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which is not allowed: if a bracketed letter like (A) is used to mark "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"some text as a response, then it can only occur once in its rule."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::non_void_context</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">downs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalParking::park</span><span class="plain-syntax">(</span><span class="identifier-syntax">frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="4-rsp.html#SP4" class="function-link"><span class="function-syntax">Responses::response_cue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule_being_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">code</span><span class="plain-syntax">, </span><span class="identifier-syntax">SW</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::boxed_frame</span><span class="plain-syntax">(</span><span class="identifier-syntax">frame</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Rules::set_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">rule_being_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">code</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">downs</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">(); </span><span class="identifier-syntax">downs</span><span class="plain-syntax">--; }</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP11_1">&#167;11.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11_1_2" class="paragraph-anchor"></a><b>&#167;11.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">This isn't a response</span><span class="named-paragraph-number">11.1.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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_unescaped_ANNOT</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">CompileValues::compiling_in_constant_mode</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">val_iname</span><span class="plain-syntax"> = </span><a href="4-tl.html#SP4" class="function-link"><span class="function-syntax">TextLiterals::to_value_unescaped</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::holster_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">val_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val_iname</span><span class="plain-syntax"> = </span><a href="4-tl.html#SP4" class="function-link"><span class="function-syntax">TextLiterals::to_value_unescaped</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::holster_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">val_iname</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="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Vocabulary::test_flags</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">), </span><span class="identifier-syntax">TEXTWITHSUBS_MC</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="4-ts.html#SP2" class="function-link"><span class="function-syntax">TextSubstitutions::text_substitution_cue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">SW</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">CompileValues::compiling_in_constant_mode</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">val_iname</span><span class="plain-syntax"> = </span><a href="4-tl.html#SP4" class="function-link"><span class="function-syntax">TextLiterals::to_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::holster_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">val_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val_iname</span><span class="plain-syntax"> = </span><a href="4-tl.html#SP4" class="function-link"><span class="function-syntax">TextLiterals::to_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::holster_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">val_iname</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="4-rsp.html#SP11_1">&#167;11.1</a>.</li></ul>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP7_2_1">&#167;7.2.1</a> (twice).</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-ts.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-fc.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-enc.html">enc</a></li><li class="progresssection"><a href="4-ll.html">ll</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="progresscurrent">rsp</li><li class="progresssection"><a href="4-bq.html">bq</a></li><li class="progresschapter"><a href="5-rsfk.html">5</a></li><li class="progresschapter"><a href="6-nmn.html">6</a></li><li class="progresschapter"><a href="7-act.html">7</a></li><li class="progresschapter"><a href="8-prs.html">8</a></li><li class="progresschapter"><a href="9-fgr.html">9</a></li><li class="progresschapter"><a href="10-sc.html">10</a></li><li class="progressnext"><a href="4-bq.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -114,18 +114,22 @@ it will always be a function.
<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">TextLiterals::small_block</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">TextLiterals::small_block</span></span>:<br/><a href="4-tl.html#SP2">&#167;2</a>, <a href="4-tl.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">content</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">small_block</span><span class="plain-syntax"> = </span><a href="4-enc.html#SP2" class="function-link"><span class="function-syntax">Enclosures::new_small_block_for_constant</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="2-ea.html#SP2" class="function-link"><span class="function-syntax">EmitArrays::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">small_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-tl.html#SP1" class="function-link"><span class="function-syntax">TextLiterals::compile_value_to</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">small_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">content</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">small_block</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">TextLiterals::compile_value_to</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">TextLiterals::compile_value_to</span></span>:<br/>Responses - <a href="4-rsp.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">at</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">content</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="2-ea.html#SP2" class="function-link"><span class="function-syntax">EmitArrays::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">CONSTANT_PACKED_TEXT_STORAGE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">content</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP6" class="function-link"><span class="function-syntax">EmitArrays::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">small_block</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. Default value. </b>The default text is empty:
</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">TextLiterals::default_text</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">TextLiterals::default_text</span></span>:<br/><a href="4-tl.html#SP4">&#167;4</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">TextLiterals::default_text</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">TextLiterals::default_text</span></span>:<br/><a href="4-tl.html#SP4">&#167;4</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-tl.html#SP1" class="function-link"><span class="function-syntax">TextLiterals::small_block</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">EMPTY_TEXT_PACKED_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
@ -139,7 +143,7 @@ source text, and nothing else.
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TextLiterals::suppress_quote_expansion</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">wn_quote_suppressed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</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="function-syntax">TextLiterals::suppressing_on</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">TextLiterals::suppressing_on</span></span>:<br/><a href="4-tl.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TextLiterals::suppressing_on</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">TextLiterals::suppressing_on</span></span>:<br/><a href="4-tl.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">wn_quote_suppressed</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><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">) == </span><span class="identifier-syntax">wn_quote_suppressed</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>
@ -152,11 +156,11 @@ much later in the process. See <a href="../codegen-module/2-cpt.html" class="int
</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">TextLiterals::to_value</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">TextLiterals::to_value</span></span>:<br/>Emit - <a href="2-emt.html#SP12">&#167;12</a><br/>Responses - <a href="4-rsp.html#SP11_1_2">&#167;11.1.2</a><br/>Action Patterns - <a href="7-ap.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">TextLiterals::to_value</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">TextLiterals::to_value</span></span>:<br/>Emit - <a href="2-emt.html#SP12">&#167;12</a><br/>Action Patterns - <a href="7-ap.html#SP5">&#167;5</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">return</span><span class="plain-syntax"> </span><a href="4-tl.html#SP4" class="function-link"><span class="function-syntax">TextLiterals::to_value_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">TextLiterals::to_value_unescaped</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">TextLiterals::to_value_unescaped</span></span>:<br/>Responses - <a href="4-rsp.html#SP11_1_2">&#167;11.1.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">TextLiterals::to_value_unescaped</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><a href="4-tl.html#SP4" class="function-link"><span class="function-syntax">TextLiterals::to_value_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</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: Enclosed Resources</a></li><li><b>Text Substitutions</b></li></ul></div>
<p class="purpose">In this section we compile text with substitutions.</p>
<ul class="toc"><li><a href="4-ts.html#SP1">&#167;1. Runtime representation</a></li><li><a href="4-ts.html#SP2">&#167;2. Cues</a></li><li><a href="4-ts.html#SP3">&#167;3. Substitutions</a></li><li><a href="4-ts.html#SP6">&#167;6. Compilation</a></li><li><a href="4-ts.html#SP9">&#167;9. It may be worth adding</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-ts.html#SP1">&#167;1. Runtime representation</a></li><li><a href="4-ts.html#SP2">&#167;2. Cues</a></li><li><a href="4-ts.html#SP3">&#167;3. Substitutions</a></li><li><a href="4-ts.html#SP6">&#167;6. Compilation</a></li><li><a href="4-ts.html#SP8">&#167;8. It may be worth adding</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Runtime representation. </b>Text substitutions arise from source text such as:
</p>
@ -161,7 +161,7 @@ wording <span class="extract"><span class="extract-syntax">"the [fox speed] brow
</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">TextSubstitutions::text_substitution_cue</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">TextSubstitutions::text_substitution_cue</span></span>:<br/>Responses - <a href="4-rsp.html#SP11_1_2">&#167;11.1.2</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">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">TextSubstitutions::text_substitution_cue</span><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">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">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</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">switch</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>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">INTER_VAL_VHMODE:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Cue in value context</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
@ -229,7 +229,6 @@ case of a response to a rule, since those are never perishable.
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">using_frame</span><span class="plain-syntax">; </span><span class="comment-syntax"> for cases where possible</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts_value_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> the I6 array for this</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ts_value_iname_used</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts_function_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> the routine to implement it</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">responding_to_rule</span><span class="plain-syntax">;</span>
@ -238,7 +237,7 @@ case of a response to a rule, since those are never perishable.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure text_substitution is accessed in 4/rsp and here.</li></ul>
<ul class="endnotetexts"><li>The structure text_substitution is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>Two inames are involved here:
</p>
@ -247,14 +246,8 @@ case of a response to a rule, since those are never perishable.
<span class="plain-syntax"> value ----------------&gt; CONSTANT_PACKED_TEXT_STORAGE or CONSTANT_PERISHABLE_TEXT_STORAGE</span>
<span class="plain-syntax"> function ----------------------&gt; ...</span>
</pre>
<p class="commentary">While the function is always compiled, the small block is only compiled if
the value iname is ever actually requested. (Sometimes when making alternative
responses we just want to make the function.)
</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">TextSubstitutions::value_iname</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">TextSubstitutions::value_iname</span></span>:<br/><a href="4-ts.html#SP2_1">&#167;2.1</a>, <a href="4-ts.html#SP2_2">&#167;2.2</a><br/>Responses - <a href="4-rsp.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_value_iname_used</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">TextSubstitutions::value_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">TextSubstitutions::value_iname</span></span>:<br/><a href="4-ts.html#SP2_1">&#167;2.1</a>, <a href="4-ts.html#SP2_2">&#167;2.2</a><br/>Responses - <a href="4-rsp.html#SP2">&#167;2</a>, <a href="4-rsp.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_value_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -262,10 +255,12 @@ responses we just want to make the function.)
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_function_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b></p>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>Note that this function is called both when cues are detected (above), and
also when responses are created &mdash; see <a href="4-rsp.html" class="internal">Responses</a>.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="function-syntax">TextSubstitutions::new_text_substitution</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">TextSubstitutions::new_text_substitution</span></span>:<br/><a href="4-ts.html#SP2_1_1">&#167;2.1.1</a><br/>Responses - <a href="4-rsp.html#SP4">&#167;4</a>, <a href="4-rsp.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="function-syntax">TextSubstitutions::new_text_substitution</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">TextSubstitutions::new_text_substitution</span></span>:<br/><a href="4-ts.html#SP2_1_1">&#167;2.1.1</a><br/>Responses - <a href="4-rsp.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax">);</span>
@ -273,9 +268,8 @@ responses we just want to make the function.)
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Too late for further text substitutions"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unsubstituted_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sentence_using_this</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="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">using_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">using_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">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="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">new_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">using_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::boxed_frame</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">new_frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax">) </span><span class="identifier-syntax">LocalVariableSlates::append</span><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">using_frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">frame</span><span class="plain-syntax">);</span>
@ -293,7 +287,6 @@ responses we just want to make the function.)
<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">P</span><span class="plain-syntax"> = </span><a href="5-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="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PR</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP21" class="function-link"><span class="function-syntax">Hierarchy::package_within</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LITERALS_HAP</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">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_value_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">TEXT_SUBSTITUTION_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="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_value_iname_used</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">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_function_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">TEXT_SUBSTITUTION_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="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_point</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
@ -304,17 +297,14 @@ responses we just want to make the function.)
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ts</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. Compilation. </b></p>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Compilation. </b>Functions for substitutions are then compiled in due course by the following coroutine
(see <a href="../core-module/1-htc.html" class="internal">How To Compile (in core)</a>):
</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">TextSubstitutions::compilation_coroutine</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-ts.html#SP6" class="function-link"><span class="function-syntax">TextSubstitutions::compile_as_needed</span></a><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">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="identifier-syntax">compiling_text_routines_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="comment-syntax"> used for better problem messages</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::compile_as_needed</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">TextSubstitutions::compile_as_needed</span></span>:<br/><a href="4-ts.html#SP8">&#167;8</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">Responses::compile_response_launchers</span></a><span class="plain-syntax">();</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::compilation_coroutine</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">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>
<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>
@ -323,13 +313,11 @@ responses we just want to make the function.)
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEXT_OBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">latest_ts_compiled</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ts</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_ts_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ts</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">responding</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">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_to_rule</span><span class="plain-syntax">) </span><span class="identifier-syntax">responding</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">responding</span><span class="plain-syntax"> == </span><span class="identifier-syntax">in_response_mode</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tr_done_already</span><span class="plain-syntax"> == </span><span class="identifier-syntax">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">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tr_done_already</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tr_done_already</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">makes_local_refs</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP7" class="function-link"><span class="function-syntax">TextSubstitutions::compile_function</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_value_iname_used</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="4-ts.html#SP1" class="function-link"><span class="function-syntax">TextSubstitutions::compile_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_value_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_function_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">makes_local_refs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-ts.html#SP1" class="function-link"><span class="function-syntax">TextSubstitutions::compile_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_value_iname</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_function_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">makes_local_refs</span><span class="plain-syntax">);</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>
@ -350,41 +338,41 @@ compiling it.
<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">current_ts_being_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">TextSubstitutions::compile_function</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">TextSubstitutions::compile_function</span></span>:<br/><a href="4-ts.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::compile_function</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">TextSubstitutions::compile_function</span></span>:<br/><a href="4-ts.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEXT_SUBSTITUTIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Compiling text routine %d %08x %W\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">using_frame</span><span class="plain-syntax">), </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unsubstituted_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_ts_being_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ts</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Functions::begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_function_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">using_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_to_rule</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_to_marker</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rules::get_response</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_to_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_to_marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) </span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><a href="4-rsp.html#SP7" class="function-link"><span class="function-syntax">Responses::frame_for_response</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</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">frame</span><span class="plain-syntax">) </span><span class="identifier-syntax">LocalVariableSlates::append</span><span class="plain-syntax">(</span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">(), </span><span class="identifier-syntax">frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Give the function access to shared variables visible to its user</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LocalVariables::monitor_local_parsing</span><span class="plain-syntax">(</span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Compile a say-phrase</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP7_2" class="named-paragraph-link"><span class="named-paragraph">Compile some debugging text</span><span class="named-paragraph-number">7.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP7_3" class="named-paragraph-link"><span class="named-paragraph">Compile a say-phrase</span><span class="named-paragraph-number">7.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">makes_local_references</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LocalVariables::local_parsed_recently</span><span class="plain-syntax">(</span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">makes_local_references</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::push_code_position</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">Produce::begin_position</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">()), </span><span class="identifier-syntax">Inter::Bookmarks::snapshot</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::at</span></a><span class="plain-syntax">()));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LocalParking::retrieve</span><span class="plain-syntax">(</span><span class="identifier-syntax">frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::pop_code_position</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">makes_local_references</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP7_4" class="named-paragraph-link"><span class="named-paragraph">Insert code at start of function to retrieve parked values</span><span class="named-paragraph-number">7.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::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">current_ts_being_compiled</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">makes_local_references</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b>Of course, if we used Inform's standard phrase mechanism exactly, then
the whole thing would be circular, because that would once again generate
a request for a new text substitution to be compiled later...
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Give the function access to shared variables visible to its user</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile a say-phrase</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><a href="4-rsp.html#SP3" class="function-link"><span class="function-syntax">Responses::frame_for_response</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_to_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">responding_to_marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">using_frame</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">frame</span><span class="plain-syntax">) </span><span class="identifier-syntax">LocalVariableSlates::append</span><span class="plain-syntax">(</span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">(), </span><span class="identifier-syntax">frame</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-ts.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>&#167;7.2. </b>In DEBUG mode, there's an option to print the unsubstituted text instead &mdash;
note the <span class="extract"><span class="extract-syntax">rtrue</span></span> here, which stops the function from proceeding.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile some debugging text</span><span class="named-paragraph-number">7.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -395,7 +383,8 @@ a request for a new text substitution to be compiled later...
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP10" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">IF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SUPPRESS_TEXT_SUBSTITUTION_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP7" class="function-link"><span class="function-syntax">EmitCode::val_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_number</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SUPPRESS_TEXT_SUBSTITUTION_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP5" class="function-link"><span class="function-syntax">EmitCode::code</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP10" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PRINT_BIP</span><span class="plain-syntax">);</span>
@ -411,7 +400,17 @@ a request for a new text substitution to be compiled later...
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-ts.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_3" class="paragraph-anchor"></a><b>&#167;7.3. </b>Of course, if we used Inform's standard phrase mechanism exactly, then
the whole thing would be circular, because that would once again generate
a request for a new text substitution to be compiled later...
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile a say-phrase</span><span class="named-paragraph-number">7.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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts_code_block</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">IMPERATIVE_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cu.html#SP4" class="function-link"><span class="function-syntax">CompilationUnits::assign_to_same_unit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts_code_block</span><span class="plain-syntax">, </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_point</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts_code_block</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">UNKNOWN_NT</span><span class="plain-syntax">);</span>
@ -424,24 +423,28 @@ a request for a new text substitution to be compiled later...
<span class="plain-syntax"> </span><a href="2-ec.html#SP11" class="function-link"><span class="function-syntax">EmitCode::rtrue</span></a><span class="plain-syntax">();</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-ts.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>See the "Responses" section for why, but we sometimes want to force
the coroutine to go through the whole queue once, then go back to the
start again &mdash; which would be very inefficient except that in this mode
we aren't doing very much; most TSs will be passed quickly over.
<p class="commentary firstcommentary"><a id="SP7_4" class="paragraph-anchor"></a><b>&#167;7.4. </b>Where a text substitution refers to local variables in the caller,
<a href="../imperative-module/3-lp.html" class="internal">Local Parking (in imperative)</a> is used to pass it the current values of those
locals; and this means that the function must begin by retrieving those values.
But since we have already compiled most of the function, we have to go back to
the start temporarily to insert this extra code.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Insert code at start of function to retrieve parked values</span><span class="named-paragraph-number">7.4</span></span><span class="comment-syntax"> =</span>
</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">TextSubstitutions::compile_text_routines_in_response_mode</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">TextSubstitutions::compile_text_routines_in_response_mode</span></span>:<br/>Responses - <a href="4-rsp.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">latest_ts_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="4-ts.html#SP6" class="function-link"><span class="function-syntax">TextSubstitutions::compile_as_needed</span></a><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">latest_ts_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::push_code_position</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::begin_position</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">()), </span><span class="identifier-syntax">Inter::Bookmarks::snapshot</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::at</span></a><span class="plain-syntax">()));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LocalParking::retrieve</span><span class="plain-syntax">(</span><span class="identifier-syntax">frame</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::pop_code_position</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. It may be worth adding. </b>Finally, the following clarifies problem messages arising from the issue of
<ul class="endnotetexts"><li>This code is used in <a href="4-ts.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. It may be worth adding. </b>Finally, the following clarifies problem messages arising from the issue of
local names being used in substitutions, since this often confuses newcomers:
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">ENDING_MESSAGE_PROBLEMS_CALLBACK</span><span class="plain-syntax"> </span><a href="4-ts.html#SP10" class="function-link"><span class="function-syntax">TextSubstitutions::append_text_substitution_proviso</span></a>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">ENDING_MESSAGE_PROBLEMS_CALLBACK</span><span class="plain-syntax"> </span><a href="4-ts.html#SP9" class="function-link"><span class="function-syntax">TextSubstitutions::append_text_substitution_proviso</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">it_is_not_worth_adding</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="comment-syntax"> To suppress the "It may be worth adding..."</span>
@ -456,10 +459,10 @@ local names being used in substitutions, since this often confuses newcomers:
<span class="plain-syntax"> </span><span class="identifier-syntax">it_is_not_worth_adding</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b></p>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </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">TextSubstitutions::append_text_substitution_proviso</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">TextSubstitutions::append_text_substitution_proviso</span></span>:<br/><a href="4-ts.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">void</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::append_text_substitution_proviso</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">TextSubstitutions::append_text_substitution_proviso</span></span>:<br/><a href="4-ts.html#SP8">&#167;8</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">it_is_not_worth_adding</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">compiling_text_routines_mode</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">current_ts_being_compiled</span><span class="plain-syntax">) &amp;&amp;</span>

View file

@ -122,7 +122,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><a href="2-hrr.html#SP12" class="function-link"><span class="function-syntax">Hierarchy::make_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="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/>Text Substitutions - <a href="4-ts.html#SP5">&#167;5</a><br/>Responses - <a href="4-rsp.html#SP4">&#167;4</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>
<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/>Text Substitutions - <a href="4-ts.html#SP5">&#167;5</a><br/>Responses - <a href="4-rsp.html#SP2">&#167;2</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>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rule_package</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -132,7 +132,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">shell_routine_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::iname</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">RTRules::iname</span></span>:<br/><a href="5-rls.html#SP4_2">&#167;4.2</a>, <a href="5-rls.html#SP5_2">&#167;5.2</a>, <a href="5-rls.html#SP5_2_1">&#167;5.2.1</a><br/>Emit - <a href="2-emt.html#SP19">&#167;19</a><br/>Responses - <a href="4-rsp.html#SP6_2">&#167;6.2</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>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::iname</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">RTRules::iname</span></span>:<br/><a href="5-rls.html#SP4_2">&#167;4.2</a>, <a href="5-rls.html#SP5_2">&#167;5.2</a>, <a href="5-rls.html#SP5_2_1">&#167;5.2.1</a><br/>Emit - <a href="2-emt.html#SP19">&#167;19</a><br/>Responses - <a href="4-rsp.html#SP7_1">&#167;7.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>
<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="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">CompileImperativeDefn::iname</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">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">rule_extern_iname</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">applicability_constraints</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
@ -153,7 +153,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">xiname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">xiname</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">RTRules::get_handler_definition</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">RTRules::get_handler_definition</span></span>:<br/>Responses - <a href="4-rsp.html#SP5_2">&#167;5.2</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>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::get_handler_definition</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">RTRules::get_handler_definition</span></span>:<br/>Responses - <a href="4-rsp.html#SP6_2">&#167;6.2</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>
<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">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rule_extern_response_handler_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">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rule_extern_response_handler_iname</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP15" class="function-link"><span class="function-syntax">Hierarchy::derive_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RESPONDER_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">xiname</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rule_package</span><span class="plain-syntax">);</span>

View file

@ -150,6 +150,15 @@ pointers:
<span class="plain-syntax"> </span><span class="identifier-syntax">CONV_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">property</span><span class="plain-syntax">) }</span>
<span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="function-syntax">Rvalues::to_rule</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">Rvalues::to_rule</span></span>:<br/><a href="2-rvl.html#SP22">&#167;22</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CONV_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax">) }</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rvalues::to_response_marker</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-rvl.html#SP21" class="function-link"><span class="function-syntax">Rvalues::is_CONSTANT_of_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_response</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">SW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">2</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="function-syntax">&lt;response-letter&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">)-1))))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</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">return</span><span class="plain-syntax"> -1;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="function-syntax">Rvalues::to_rulebook</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">Rvalues::to_rulebook</span></span>:<br/><a href="2-rvl.html#SP22">&#167;22</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CONV_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">rulebook</span><span class="plain-syntax">) }</span>
<span class="identifier-syntax">table</span><span class="plain-syntax"> *</span><span class="function-syntax">Rvalues::to_table</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>
@ -446,7 +455,7 @@ in the proposition.
<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">Rvalues::is_CONSTANT_of_kind</span><button class="popup" onclick="togglePopup('usagePopup34')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup34">Usage of <span class="code-font"><span class="function-syntax">Rvalues::is_CONSTANT_of_kind</span></span>:<br/><a href="2-rvl.html#SP11">&#167;11</a>, <a href="2-rvl.html#SP12">&#167;12</a>, <a href="2-rvl.html#SP13">&#167;13</a>, <a href="2-rvl.html#SP14">&#167;14</a><br/>Literal Patterns - <a href="3-lp.html#SP24_3">&#167;24.3</a><br/>Enter the S-Parser - <a href="4-ets.html#SP11">&#167;11</a><br/>Constants and Descriptions - <a href="4-cad.html#SP3">&#167;3</a>, <a href="4-cad.html#SP5">&#167;5</a><br/>Type Expressions and Values - <a href="4-teav.html#SP11_2">&#167;11.2</a><br/>Conditions and Phrases - <a href="4-cap.html#SP10_1">&#167;10.1</a><br/>Dash - <a href="5-dsh.html#SP16">&#167;16</a>, <a href="5-dsh.html#SP18_5_2">&#167;18.5.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Rvalues::is_CONSTANT_of_kind</span><button class="popup" onclick="togglePopup('usagePopup34')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup34">Usage of <span class="code-font"><span class="function-syntax">Rvalues::is_CONSTANT_of_kind</span></span>:<br/><a href="2-rvl.html#SP3">&#167;3</a>, <a href="2-rvl.html#SP11">&#167;11</a>, <a href="2-rvl.html#SP12">&#167;12</a>, <a href="2-rvl.html#SP13">&#167;13</a>, <a href="2-rvl.html#SP14">&#167;14</a><br/>Literal Patterns - <a href="3-lp.html#SP24_3">&#167;24.3</a><br/>Enter the S-Parser - <a href="4-ets.html#SP11">&#167;11</a><br/>Constants and Descriptions - <a href="4-cad.html#SP3">&#167;3</a>, <a href="4-cad.html#SP5">&#167;5</a><br/>Type Expressions and Values - <a href="4-teav.html#SP11_2">&#167;11.2</a><br/>Conditions and Phrases - <a href="4-cap.html#SP10_1">&#167;10.1</a><br/>Dash - <a href="5-dsh.html#SP16">&#167;16</a>, <a href="5-dsh.html#SP18_5_2">&#167;18.5.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">CONSTANT_NT</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_kind_of_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">), </span><span class="identifier-syntax">K</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>

View file

@ -1,12 +1,12 @@
Total memory consumption was 278685K = 272 MB
Total memory consumption was 279485K = 273 MB
63.7% was used for 1358697 objects, in 311577 frames in 222 x 800K = 177600K = 173 MB:
63.8% was used for 1358051 objects, in 311030 frames in 223 x 800K = 178400K = 174 MB:
9.3% inter_tree_node_array 37 x 8192 = 303104 objects, 26674336 bytes
5.6% linked_list 28812 objects, 16134720 bytes
5.5% linked_list 28539 objects, 15981840 bytes
5.4% text_stream_array 2745 x 100 = 274500 objects, 15459840 bytes
3.6% parse_node 129367 objects, 10349360 bytes
2.6% verb_conjugation 160 objects, 7425280 bytes
2.5% verb_conjugation 160 objects, 7425280 bytes
2.2% inter_symbol_array 71 x 1024 = 72704 objects, 6400224 bytes
1.9% parse_node_annotation_array 345 x 500 = 172500 objects, 5531040 bytes
1.1% pcalc_prop_array 24 x 1000 = 24000 objects, 3264768 bytes
@ -32,12 +32,12 @@ Total memory consumption was 278685K = 272 MB
0.2% dict_entry_array 243 x 100 = 24300 objects, 785376 bytes
0.2% inter_name_generator_array 18 x 1000 = 18000 objects, 720576 bytes
0.2% unary_predicate_array 16 x 1000 = 16000 objects, 640512 bytes
0.1% local_variable_array 45 x 100 = 4500 objects, 433440 bytes
0.1% local_variable_array 44 x 100 = 4400 objects, 423808 bytes
0.1% verb_usage 1128 objects, 388032 bytes
0.1% scan_directory 94 objects, 388032 bytes
0.1% rule 469 objects, 363944 bytes
0.1% verb_form 386 objects, 342768 bytes
0.1% noun 2379 objects, 285480 bytes
---- noun 2379 objects, 285480 bytes
---- inference_subject 665 objects, 260680 bytes
---- inter_annotation_array 1 x 8192 objects, 196640 bytes
---- linguistic_stock_item 3315 objects, 159120 bytes
@ -63,19 +63,18 @@ Total memory consumption was 278685K = 272 MB
---- spatial_data 670 objects, 64320 bytes
---- kind_macro_definition 9 objects, 62280 bytes
---- booking 860 objects, 61920 bytes
---- scenes_rcd_data 1880 objects, 60160 bytes
---- actions_rcd_data 1880 objects, 60160 bytes
---- scenes_rcd_data 1880 objects, 60160 bytes
---- command_grammar 130 objects, 58240 bytes
---- pcalc_func_array 1 x 1000 objects, 56032 bytes
---- kind_constructor 77 objects, 55440 bytes
---- stack_frame_box 577 objects, 55392 bytes
---- cg_token 603 objects, 53064 bytes
---- property_inference_data 1315 objects, 52600 bytes
---- ap_clause_array 2 x 400 = 800 objects, 51264 bytes
---- cg_line 230 objects, 47840 bytes
---- table 7 objects, 45528 bytes
---- text_substitution 436 objects, 45344 bytes
---- inter_node_list 750 objects, 42000 bytes
---- text_substitution 436 objects, 41856 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
@ -85,6 +84,7 @@ Total memory consumption was 278685K = 272 MB
---- regions_data 670 objects, 32160 bytes
---- HTML_tag_array 1 x 1000 objects, 32032 bytes
---- property_permission 96 objects, 30720 bytes
---- stack_frame_box 304 objects, 29184 bytes
---- verb_sense 403 objects, 29016 bytes
---- shared_variable_set_array 6 x 100 = 600 objects, 28992 bytes
---- heading 198 objects, 28512 bytes
@ -101,9 +101,9 @@ Total memory consumption was 278685K = 272 MB
---- parse_node_tree 20 objects, 17280 bytes
---- method 341 objects, 16368 bytes
---- understanding_reference_array 2 x 100 = 200 objects, 16064 bytes
---- linked_list_item_array 1 x 1000 objects, 16032 bytes
---- action_name_list_array 1 x 1000 objects, 16032 bytes
---- match_avinue_array 1 x 1000 objects, 16032 bytes
---- linked_list_item_array 1 x 1000 objects, 16032 bytes
---- to_phrase_request 59 objects, 15576 bytes
---- adjective 137 objects, 14248 bytes
---- booking_list 407 objects, 13024 bytes
@ -135,8 +135,8 @@ Total memory consumption was 278685K = 272 MB
---- method_set 104 objects, 3328 bytes
---- kind_constructor_comparison_schema_array 1 x 100 objects, 3232 bytes
---- instance_usage_array 1 x 200 objects, 3232 bytes
---- definition 44 objects, 3168 bytes
---- compatibility_specification 66 objects, 3168 bytes
---- definition 44 objects, 3168 bytes
---- inform_extension 19 objects, 3040 bytes
---- property_of_value_storage 93 objects, 2976 bytes
---- either_or_property_data 62 objects, 2976 bytes
@ -150,8 +150,8 @@ Total memory consumption was 278685K = 272 MB
---- semver_range 22 objects, 2288 bytes
---- scene 1 object, 2096 bytes
---- use_option 29 objects, 1856 bytes
---- pronoun_usage 42 objects, 1680 bytes
---- pipeline_step 14 objects, 1680 bytes
---- pronoun_usage 42 objects, 1680 bytes
---- activity_crossref_array 1 x 100 objects, 1632 bytes
---- table_contribution_array 1 x 100 objects, 1632 bytes
---- plugin 25 objects, 1600 bytes
@ -159,8 +159,8 @@ Total memory consumption was 278685K = 272 MB
---- noun_filter_token 22 objects, 1408 bytes
---- inter_annotation_form 35 objects, 1400 bytes
---- special_meaning_holder 33 objects, 1320 bytes
---- constant_phrase 20 objects, 1280 bytes
---- build_script 40 objects, 1280 bytes
---- constant_phrase 20 objects, 1280 bytes
---- invocation_options_array 1 x 100 objects, 1224 bytes
---- direction_inference_data 30 objects, 1200 bytes
---- hierarchy_metadatum 15 objects, 1200 bytes
@ -168,8 +168,8 @@ Total memory consumption was 278685K = 272 MB
---- pipeline_stage 19 objects, 912 bytes
---- table_column 16 objects, 896 bytes
---- inbuild_requirement 22 objects, 880 bytes
---- code_generation 1 object, 864 bytes
---- control_structure_phrase 12 objects, 864 bytes
---- code_generation 1 object, 864 bytes
---- cached_understanding 21 objects, 840 bytes
---- runtime_kind_structure 13 objects, 832 bytes
---- phrase_option_array 1 x 100 objects, 824 bytes
@ -178,18 +178,18 @@ Total memory consumption was 278685K = 272 MB
---- inter_data_type 14 objects, 784 bytes
---- submodule_identity 23 objects, 736 bytes
---- inform_language 6 objects, 672 bytes
---- inter_warehouse_room 10 objects, 640 bytes
---- relation_guard 5 objects, 640 bytes
---- I6T_intervention 8 objects, 640 bytes
---- named_rulebook_outcome 15 objects, 600 bytes
---- relation_guard 5 objects, 640 bytes
---- inter_warehouse_room 10 objects, 640 bytes
---- inbuild_search_result 15 objects, 600 bytes
---- named_rulebook_outcome 15 objects, 600 bytes
---- rulebook_outcome 17 objects, 544 bytes
---- small_word_set 11 objects, 528 bytes
---- inform_kit 5 objects, 520 bytes
---- implication 13 objects, 520 bytes
---- inference_family 11 objects, 440 bytes
---- equation 4 objects, 416 bytes
---- i6_memory_setting 13 objects, 416 bytes
---- equation 4 objects, 416 bytes
---- dval_written 10 objects, 400 bytes
---- article_usage 8 objects, 384 bytes
---- bp_family 12 objects, 384 bytes
@ -236,10 +236,10 @@ Total memory consumption was 278685K = 272 MB
---- kind_template_definition 1 object, 40 bytes
---- by_routine_bp_data 1 object, 40 bytes
36.2% was used for memory not allocated for objects:
36.1% was used for memory not allocated for objects:
15.8% text stream storage 45362796 bytes in 282770 claims
3.5% dictionary storage 10015744 bytes in 17805 claims
15.8% text stream storage 45362852 bytes in 282770 claims
3.4% dictionary storage 10015744 bytes in 17805 claims
---- sorting 968 bytes in 3 claims
2.5% source text 7200000 bytes in 3 claims
3.7% source text details 10800000 bytes in 2 claims
@ -254,5 +254,5 @@ Total memory consumption was 278685K = 272 MB
---- emitter array storage 175296 bytes in 2064 claims
---- code generation workspace for objects 19736 bytes in 13 claims
20.1% was overhead - 57492712 bytes = 56145K = 54 MB
20.4% was overhead - 58504120 bytes = 57132K = 55 MB

View file

@ -1,30 +1,31 @@
100.0% in inform7 run
64.0% in compilation to Inter
24.5% in //ImperativeDefinitions::compile_first_block//
8.4% in //Sequence::compile_function_resources//
7.0% in //Responses::compile_responses//
5.7% in //InferenceSubjects::emit_all//
64.6% in compilation to Inter
24.8% in //ImperativeDefinitions::compile_first_block//
11.7% in //Sequence::compile_function_resources//
5.9% in //InferenceSubjects::emit_all//
3.6% in //MajorNodes::pre_pass//
3.1% in //MajorNodes::pass_1//
3.5% in //Responses::compile_synoptic_resources//
3.3% in //MajorNodes::pass_1//
1.9% in //RTRules::RulePrintingRule_routine//
1.7% in //ImperativeDefinitions::assess_all//
1.7% in //RTRules::rulebooks_array_array//
1.5% in //ImperativeDefinitions::assess_all//
1.0% in //RTVerbs::ConjugateVerb//
0.5% in //RTRules::compile_rulebooks//
0.5% in //World::stage_V//
0.3% in //MajorNodes::pass_2//
0.3% in //RTRelations::compile_defined_relations//
0.3% in //World::stage_V//
0.1% in //RTCommandGrammars::compile_all//
0.1% in //RTKinds::compile_data_type_support_routines//
0.1% in //Task::make_built_in_kind_constructors//
2.9% not specifically accounted for
33.4% in running Inter pipeline
12.0% in step preparation
0.1% in //World::stages_II_and_III//
2.8% not specifically accounted for
33.0% in running Inter pipeline
11.7% in step preparation
9.4% in inter step 2/14: link
7.1% in inter step 14/14: generate inform6 -> auto.inf
7.0% in inter step 14/14: generate inform6 -> auto.inf
0.7% in inter step 10/14: consolidate-text
0.5% in inter step 9/14: make-identifiers-unique
0.3% in inter step 13/14: eliminate-redundant-operations
0.3% in inter step 9/14: make-identifiers-unique
0.1% in inter step 11/14: reconcile-verbs
0.1% in inter step 12/14: eliminate-redundant-labels
0.1% in inter step 4/14: parse-linked-matter
@ -34,4 +35,4 @@
0.1% in inter step 8/14: inspect-plugs
2.1% not specifically accounted for
1.9% in supervisor
0.6% not specifically accounted for
0.4% not specifically accounted for

View file

@ -332,10 +332,8 @@ void Translations::plus_responses(parse_node *p, rule *R) {
Translations::plus_responses(p->down->next, R);
} else {
if (<extra-response>(Node::get_text(p))) {
int code = <<r>>;
response_message *resp = Responses::response_cue(NULL, R,
code, Node::get_text(p), NULL, TRUE);
Rules::set_response(R, code, resp);
int marker = <<r>>;
Responses::set_via_translation(R, marker, Node::get_text(p));
} else {
StandardProblems::sentence_problem(Task::syntax_tree(),
_p_(PM_I6ResponsesAwry),

View file

@ -1761,7 +1761,7 @@ but that's not evident without a lot of contextual checking.
(Rvalues::is_CONSTANT_of_kind(val, K_text))) {
rule *R = Rvalues::to_rule(constant);
int c = Annotations::read_int(constant, response_code_ANNOT);
Responses::assert_response_value(R, c, Node::get_text(val));
Rules::now_rule_needs_response(R, c, Node::get_text(val));
return;
}

View file

@ -516,7 +516,7 @@ rule_response Rules::new_rule_response(void) {
return rr;
}
wording Rules::get_response_content(rule *R, int code) {
wording Rules::get_response_replacement_wording(rule *R, int code) {
if (R == NULL) return EMPTY_WORDING;
if ((code < 0) || (code >= 26)) return EMPTY_WORDING;
return R->responses[code].content;

View file

@ -218,7 +218,7 @@ so on. Those absolute basics are made here.
BENCH(PhraseRequests::invoke_to_begin)
BENCH(Closures::compile_closures)
BENCH(Sequence::compile_function_resources)
BENCH(Responses::compile_responses)
BENCH(Responses::compile_synoptic_resources)
BENCH(Sequence::compile_literal_resources)
BENCH(RTRelations::compile_defined_relations)
BENCH(Sequence::compile_function_resources)
@ -306,6 +306,7 @@ void Sequence::compile_function_resources(void) {
if (PhraseRequests::compilation_coroutine() > 0) repeat = TRUE;
if (ListTogether::compilation_coroutine() > 0) repeat = TRUE;
if (LoopingOverScope::compilation_coroutine() > 0) repeat = TRUE;
if (Responses::compilation_coroutine() > 0) repeat = TRUE;
if (TextSubstitutions::compilation_coroutine() > 0) repeat = TRUE;
if (DeferredPropositions::compilation_coroutine() > 0) repeat = TRUE;

View file

@ -163,7 +163,7 @@ kinds of value:
return;
}
if (Kinds::eq(kind_of_constant, K_text)) {
Responses::compile_general(VH, value);
CompileRvalues::text(VH, value);
return;
}
#ifdef IF_MODULE
@ -243,3 +243,78 @@ contexts by using a tilde: |~attr|.
Emit::holster_iname(VH, RTProperties::iname(prn));
}
}
@ Texts can be compiled in four different ways, so the following splits into
four cases. Note that responses take the form
= (text)
"blah blah blah" ( letter )
=
so the penultimate word, if it's there, is the letter.
=
void CompileRvalues::text(value_holster *VH, parse_node *str) {
if (Holsters::non_void_context(VH) == FALSE) internal_error("text in void context");
if (Annotations::read_int(str, explicit_literal_ANNOT)) {
@<This is an explicit text@>;
} else {
wording SW = Node::get_text(str);
int unescaped = Annotations::read_int(str, text_unescaped_ANNOT);
if (Wordings::empty(SW)) internal_error("text without wording");
if ((Wordings::length(SW) >= 2) &&
(<response-letter>(Wordings::one_word(Wordings::last_wn(SW)-1)))) {
@<This is a response text@>;
} else if ((unescaped == 0) &&
(Vocabulary::test_flags(Wordings::first_wn(SW), TEXTWITHSUBS_MC))) {
@<This is a text substitution@>;
} else if (unescaped) {
@<This is an unescaped text literal@>;
} else {
@<This is a regular text literal@>;
}
}
}
@ Not explicit in the sense of an advisory sticker on an Eminem CD: explicit
in providing a text stream for its content, rather than a wording from the
source text. (This usually means it has been manufactured somewhere in the
compiler, rather than parsed from the source.)
@<This is an explicit text@> =
if (Node::get_explicit_iname(str)) {
if (Holsters::non_void_context(VH)) {
Emit::holster_iname(VH, Node::get_explicit_iname(str));
} else internal_error("unvalued SCG");
} else {
int A = Annotations::read_int(str, constant_number_ANNOT);
if (Holsters::non_void_context(VH))
Holsters::holster_pair(VH, LITERAL_IVAL, (inter_ti) A);
}
@<This is a response text@> =
int marker = <<r>>;
if ((rule_being_compiled == NULL) ||
(Rules::rule_allows_responses(rule_being_compiled) == FALSE)) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseContextWrong),
"lettered responses can only be used in named rules",
"not in any of the other contexts in which quoted text can appear.");
return;
}
if (Rules::get_response(rule_being_compiled, marker)) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseDuplicated),
"this duplicates a response letter",
"which is not allowed: if a bracketed letter like (A) is used to mark "
"some text as a response, then it can only occur once in its rule.");
return;
}
Responses::set_via_source_text(VH, rule_being_compiled, marker, SW);
@<This is a text substitution@> =
TextSubstitutions::text_substitution_cue(VH, SW);
@<This is an unescaped text literal@> =
inter_name *val_iname = TextLiterals::to_value_unescaped(SW);
Emit::holster_iname(VH, val_iname);
@<This is a regular text literal@> =
inter_name *val_iname = TextLiterals::to_value(SW);
Emit::holster_iname(VH, val_iname);

View file

@ -115,7 +115,7 @@ Here |this| is the term in question, and |other| the other of the two.
if ((m & ADOPT_LOCAL_STACK_FRAME_ISSBM) &&
(Rvalues::is_CONSTANT_of_kind(other->constant, K_response))) {
rule_to_which_this_is_a_response = Rvalues::to_rule(other->constant);
response_marker_within_that_rule = Responses::get_marker_from_response_spec(other->constant);
response_marker_within_that_rule = Rvalues::to_response_marker(other->constant);
}
kind *K = NULL;
if (m & CAST_TO_KIND_OF_OTHER_TERM_ISSBM) K = other->term_checked_as_kind;

View file

@ -87,7 +87,7 @@ int IXRules::index(OUTPUT_STREAM, rule *R, rulebook *owner, rule_context rc) {
if (R->responses[l].message) {
if (c == 0) Index::extra_div_open_nested(OUT, 1000000+R->allocation_id, 2);
else HTML_TAG("br");
Responses::index_response(OUT, R, l, R->responses[l].message);
IXRules::index_response(OUT, R, l, R->responses[l].message);
c++;
}
if (c > 0) Index::extra_div_close_nested(OUT);
@ -737,3 +737,31 @@ int IXRules::phrase_fits_rule_context(id_body *idb, rule_context rc) {
if (Scenes::rcd_scene(&(idb->runtime_context_data)) != rc.scene_context) return FALSE;
return TRUE;
}
@ When we index a response, we also provide a paste button for the source
text to assert a change:
=
void IXRules::index_response(OUTPUT_STREAM, rule *R, int marker, response_message *resp) {
WRITE("&nbsp;&nbsp;&nbsp;&nbsp;");
HTML_OPEN_WITH("span",
"style=\"color: #ffffff; "
"font-family: 'Courier New', Courier, monospace; background-color: #8080ff;\"");
WRITE("&nbsp;&nbsp;%c&nbsp;&nbsp; ", 'A' + marker);
HTML_CLOSE("span");
HTML_OPEN_WITH("span", "style=\"color: #000066;\"");
WRITE("%+W", resp->the_ts->unsubstituted_text);
HTML_CLOSE("span");
WRITE("&nbsp;&nbsp;");
TEMPORARY_TEXT(S)
WRITE_TO(S, "%+W response (%c)", R->name, 'A' + marker);
PasteButtons::paste_text(OUT, S);
WRITE("&nbsp;<i>name</i>");
WRITE("&nbsp;");
Str::clear(S);
WRITE_TO(S, "The %+W response (%c) is \"New text.\".");
PasteButtons::paste_text(OUT, S);
WRITE("&nbsp;<i>set</i>");
DISCARD_TEXT(S)
}

View file

@ -2,113 +2,197 @@
In this section we keep track of response texts.
@ Responses are texts -- which may be either literals or text substitutions --
@h Introduction.
Responses are texts -- which may be either literals or text substitutions --
occurring inside the body of rules, and marked out (A), (B), (C), ... within
that rule. This enables them to be manipulated or changed.
that rule. This enables them to be manipulated or changed. For example:
= (text as Inform 7)
Report an actor taking (this is the standard report taking rule):
if the action is not silent:
if the actor is the player:
say "Taken." (A);
otherwise:
say "[The actor] [pick] up [the noun]." (B).
=
In effect there is a two-element array attached to this rule, one holding
the current response (A), the other (B). These are identified by an index called
the "marker", which counts from 0: so (A) is 0, (B) is 1.
Those original appearances inside the rule are called the "cues". The texts are
stored as //Text Substitutions//, even if, as in example (A) here, they do not
actually involve any substituting. (It's simpler to have a common format, and in
any case these are the exception.) All of the difficulties attendant on text
substitutions apply here, too. Note, for example, that (B) refers to the "actor",
a shared variable which is not normally visible from here:
= (text as Inform 7)
To grab is a verb.
When play begins:
now the standard report taking rule response (B) is "[The actor] [grab] [the noun]."
=
Here, "actor" has to be read in the context of the standard report taking rule's
stack frame, not in the stack for the "when play begins" rule.
Each time a cue is found, a |response_message| object is created, as follows:
=
typedef struct response_message {
struct rule *responding_rule; /* named rule in which this response occurs */
int response_marker; /* 0 for A, 1 for B, and so on up */
struct text_substitution *original_text;
struct rule *the_rule; /* to which this is a response */
int the_marker; /* 0 for A, 1 for B, and so on up */
struct text_substitution *the_ts;
struct stack_frame *original_stack_frame;
struct inter_name *resp_iname;
struct inter_name *value_iname;
struct inter_name *constant_iname;
struct package_request *resp_package;
struct inter_name *launcher_iname;
int launcher_compiled;
int via_I6; /* if responding to a rule defined by I6 code, not source text */
int via_I6_routine_compiled;
int via_Inter; /* if responding to a rule defined by Inter code, not source text */
int via_Inter_routine_compiled;
CLASS_DEFINITION
} response_message;
@ Continuing with our naming convention for text resources at runtime, here
is the "launcher" routine for a response:
@ Note that each response has its own package, which is stored inside the package
of the rule to which it responds.
It occasionally happens that assertion sentences have changed the wording of a
response long before any code is compiled, and therefore before this call,
through a sentence like:
= (text as Inform 7)
The print empty inventory rule response (A) is "I got nothing."
=
This would cause |RW|, the replacement wording, below to be |"I got nothing."|.
=
inter_name *Responses::response_launcher_iname(response_message *resp) {
return resp->resp_iname;
}
@ Each response is itself a value at run-time, and the following compiles
its name in the output code:
=
inter_name *Responses::response_constant_iname(rule *R, int marker) {
response_message *RM = Rules::get_response(R, marker);
if (RM == NULL) return NULL;
if (RM->constant_iname == NULL) internal_error("no response value");
return RM->constant_iname;
}
@ The following is called in response to a usage of a text followed by a
response marker; for example,
>> say "You can't open [the noun]." (A);
We compile it as the name of the response's "launcher" routine; that is, as
the launcher for response (A) of the rule currently being compiled.
The original text, |"You can't open [the noun]."| is then remembered as if
it were a text substitution -- as of course it is, but it may be supplanted
at run-time, or even before that. (For simplicity we choose to treat the text
as a substitution even if, in fact, it's just literal text.) All of the
problems usually attendant on text substitutions apply here, too; we
need to remember the stack frame for later.
Thus the above source text will produce not only a |TX_R_*| launcher routine,
but also (in most cases) a |TX_S_*| text substitution routine.
=
response_message *Responses::response_cue(value_holster *VH, rule *owner, int marker,
wording W, stack_frame *frame, int via_I6) {
response_message *Responses::response_cue(rule *R, int marker, wording W, stack_frame *frame) {
response_message *resp = CREATE(response_message);
resp->original_stack_frame = Frames::boxed_frame(frame);
resp->responding_rule = owner;
resp->response_marker = marker;
resp->original_text = TextSubstitutions::new_text_substitution(W, frame, owner, marker);
resp->original_stack_frame = frame;
resp->the_rule = R;
resp->the_marker = marker;
resp->launcher_compiled = FALSE;
resp->via_I6 = via_I6;
resp->via_I6_routine_compiled = FALSE;
resp->resp_package = Hierarchy::package_within(RESPONSES_HAP, RTRules::package(resp->responding_rule));
resp->resp_iname = Hierarchy::make_iname_in(AS_BLOCK_CONSTANT_HL, resp->resp_package);
resp->constant_iname = Hierarchy::make_iname_in(AS_CONSTANT_HL, resp->resp_package);
if (VH) {
if (Holsters::non_void_context(VH)) {
EmitCode::val_iname(K_value, Responses::response_launcher_iname(resp));
}
}
resp->via_Inter = FALSE;
resp->via_Inter_routine_compiled = FALSE;
package_request *PR = Hierarchy::package_within(RESPONSES_HAP, RTRules::package(R));
resp->constant_iname = Hierarchy::make_iname_in(AS_CONSTANT_HL, PR);
resp->value_iname = Hierarchy::make_iname_in(AS_BLOCK_CONSTANT_HL, PR);
resp->launcher_iname = Hierarchy::make_iname_in(LAUNCHER_HL, PR);
Rules::set_response(R, marker, resp);
wording RW = Rules::get_response_replacement_wording(R, marker);
if (Wordings::nonempty(RW)) W = RW;
resp->the_ts = TextSubstitutions::new_text_substitution(W, frame, R, marker);
TextSubstitutions::value_iname(resp->the_ts);
return resp;
}
@ Response launchers can be compiled in sets, but not quite all at once.
The following code is quadratic in the number of responses, but it really
doesn't matter, since so little is done and the response count can't be
enormous.
@ Some access functions:
=
void Responses::compile_response_launchers(void) {
inter_name *Responses::response_launcher_iname(response_message *resp) {
return resp->value_iname;
}
inter_name *Responses::response_constant_iname(rule *R, int marker) {
response_message *resp = Rules::get_response(R, marker);
if (resp == NULL) return NULL;
if (resp->constant_iname == NULL) internal_error("no response value");
return resp->constant_iname;
}
stack_frame *Responses::frame_for_response(rule *R, int marker) {
response_message *resp = Rules::get_response(R, marker);
if (resp == NULL) return NULL;
return resp->original_stack_frame;
}
@h How rules gain responses.
There are two ways a rule can get a new response. Firstly, and the way most
Inform authors do it:
= (text as Inform 7)
say "[The actor] [pick] up [the noun]." (B).
=
Will cause //Responses::set_via_source_text// to be called. This compiles Inter
code suitable for the response to be called (i.e., printed), setting up the cue
and attaching it to its rule in the process.
Note the use of //imperative: Local Parking// to stash local values before the
evaluation: and see //TextSubstitutions::compile_function// for where those are
retrieved.
=
void Responses::set_via_source_text(value_holster *VH, rule *R, int marker, wording SW) {
stack_frame *frame = Frames::current_stack_frame();
int downs = LocalParking::park(frame);
response_message *resp =
Responses::response_cue(R, marker, SW, Frames::boxed_frame(frame));
EmitCode::val_iname(K_value, Responses::response_launcher_iname(resp));
while (downs > 0) { EmitCode::up(); downs--; }
}
@ Secondly, a lower-level technique used by extensions to give responses even
to rules defined in Inter kits rather than by source text:
= (text as Inform 7)
The requested actions require persuasion rule translates into Inter as
"REQUESTED_ACTIONS_REQUIRE_R" with
"[The noun] [have] better things to do." (A).
=
Which causes the following to be called:
=
void Responses::set_via_translation(rule *R, int marker, wording SW) {
response_message *resp = Responses::response_cue(R, marker, SW, NULL);
resp->via_Inter = TRUE;
}
@h Compilation.
Values and launchers for responses are then compiled in due course by the
following coroutine (see //core: How To Compile//):
=
int Responses::compilation_coroutine(void) {
int N = 0;
response_message *resp;
LOOP_OVER(resp, response_message) {
if (resp->launcher_compiled == FALSE) {
resp->launcher_compiled = TRUE;
@<Compile the actual launcher@>;
if ((resp->via_I6) && (resp->via_I6_routine_compiled == FALSE))
@<If the response is via I6, compile the necessary routine for this rule@>;
N++;
@<Compile resources needed by this response@>;
}
if ((resp->via_Inter) && (resp->via_Inter_routine_compiled == FALSE)) {
response_message *r2;
LOOP_OVER(r2, response_message)
if (r2->the_rule == resp->the_rule)
r2->via_Inter_routine_compiled = TRUE;
N++;
@<Compile the response-handler function for this rule@>;
}
}
return N;
}
@ Each response is itself a value, and the launcher routine consists only of
a call to an activity based on that value:
@ Each response compiles to a text value like so:
= (text)
small block:
value ----------------> CONSTANT_PACKED_TEXT_STORAGE
launcher function ----------------------> ...
=
Thus, printing this value at runtime calls the launcher function. This in
turn runs the "issuing the response text" activity, though it does it via
a function defined in //BasicInformKit//.
@<Compile the actual launcher@> =
package_request *R = resp->resp_package;
inter_name *launcher = Hierarchy::make_iname_in(LAUNCHER_HL, R);
@<Compile resources needed by this response@> =
text_substitution *ts = resp->the_ts;
inter_name *ts_value_iname = TextSubstitutions::value_iname(ts);
inter_name *rc_iname =
Responses::response_constant_iname(resp->the_rule, resp->the_marker);
Emit::response(rc_iname, resp->the_rule, resp->the_marker, ts_value_iname);
packaging_state save = Functions::begin(launcher);
TextLiterals::compile_value_to(resp->value_iname, resp->launcher_iname);
packaging_state save = Functions::begin(resp->launcher_iname);
inter_name *iname = Responses::response_constant_iname(
resp->responding_rule, resp->response_marker);
resp->the_rule, resp->the_marker);
inter_name *rname = Hierarchy::find(RESPONSEVIAACTIVITY_HL);
EmitCode::call(rname);
@ -118,19 +202,13 @@ a call to an activity based on that value:
Functions::end(save);
save = EmitArrays::begin(resp->resp_iname, K_value);
EmitArrays::iname_entry(Hierarchy::find(CONSTANT_PACKED_TEXT_STORAGE_HL));
EmitArrays::iname_entry(launcher);
EmitArrays::end(save);
@ Something skated over above is that responses can also be created when the
source text defines a rule only as an I6 routine. For example:
>> The hack mode rule translates into I6 as "HACK_MODE_ON_R" with "Hack mode on." (A).
Responses like this one are "via I6", and they cause us to create a support
routine for the rule, called in this case |HACK_MODE_ON_RM|. The rule then
calls
source text defines a rule only as an Inter routine. For example:
= (text as Inform 7)
The hack mode rule translates into Inter as "HACK_MODE_ON_R" with "Hack mode on." (A).
=
Responses like this one are "via Inter", and they cause us to create a handler
function for the rule, called (say) |HACK_MODE_ON_RM|. The rule then calls:
= (text as Inform 6)
HACK_MODE_ON_RM('A');
=
@ -138,11 +216,12 @@ to produce response (A), or alternatively
= (text as Inform 6)
HACK_MODE_ON_RM('a');
=
to return the current text of (A) without printing it. Speed is not of the
essence here.
to return the current text of (A) without printing it. Speed is not of the essence;
and note that the response-handler is created in the package for the rule to which
it responds.
@<If the response is via I6, compile the necessary routine for this rule@> =
inter_name *responder_iname = RTRules::get_handler_definition(resp->responding_rule);
@<Compile the response-handler function for this rule@> =
inter_name *responder_iname = RTRules::get_handler_definition(resp->the_rule);
packaging_state save = Functions::begin(responder_iname);
inter_symbol *code_s = LocalVariables::new_other_as_symbol(I"code");
inter_symbol *val_s = LocalVariables::new_other_as_symbol(I"val");
@ -225,20 +304,19 @@ essence here.
EmitCode::down();
response_message *r2;
LOOP_OVER(r2, response_message) {
if (r2->responding_rule == resp->responding_rule) {
if (r2->the_rule == resp->the_rule) {
EmitCode::inv(CASE_BIP);
EmitCode::down();
EmitCode::val_number((inter_ti) ('A' + r2->response_marker));
EmitCode::val_number((inter_ti) ('A' + r2->the_marker));
EmitCode::code();
EmitCode::down();
EmitCode::inv(STORE_BIP);
EmitCode::down();
EmitCode::ref_symbol(K_value, str_s);
EmitCode::val_iname(K_value, r2->resp_iname);
EmitCode::val_iname(K_value, r2->value_iname);
EmitCode::up();
EmitCode::up();
EmitCode::up();
r2->via_I6_routine_compiled = TRUE;
}
}
EmitCode::up();
@ -287,42 +365,14 @@ essence here.
Functions::end(save);
@ So much for the launchers. We also have to compile the response values,
and some run-time tables which will enable the I6 template code to keep
track of the content of each response.
@ There's then one function and one array left to compile:
=
void Responses::compile_responses(void) {
@<Compile the array holding the current text of each response@>;
void Responses::compile_synoptic_resources(void) {
@<Compile the PrintResponse routine@>;
@<Compile the Response Divisions array@>;
TextSubstitutions::compile_text_routines_in_response_mode();
}
@ Note that each rule is allowed to tell us that it already has a better
text for the response than the one we first created.
@<Compile the array holding the current text of each response@> =
rule *R;
LOOP_OVER(R, rule) {
int marker;
for (marker = 0; marker < 26; marker++) {
response_message *resp = Rules::get_response(R, marker);
if (resp) {
text_substitution *ts = resp->original_text;
wording W = Rules::get_response_content(R, marker);
if (Wordings::nonempty(W)) { /* i.e., if the rule gives us a better text */
current_sentence = Rules::get_response_sentence(R, marker);
ts = TextSubstitutions::new_text_substitution(W, NULL, R, marker);
resp->original_text->tr_done_already = TRUE;
}
inter_name *ts_value_iname = TextSubstitutions::value_iname(ts);
inter_name *rc_iname = Responses::response_constant_iname(R, marker);
Emit::response(rc_iname, R, marker, ts_value_iname);
}
}
}
@ This is in effect a big switch statement, so it's not fast; but as usual
with printing routines it really doesn't need to be. Given a response value,
say |R_14_RESP_B|, we print its current text, say response (B) for |R_14|.
@ -333,8 +383,8 @@ say |R_14_RESP_B|, we print its current text, say response (B) for |R_14|.
inter_symbol *R_s = LocalVariables::new_other_as_symbol(I"R");
response_message *resp;
LOOP_OVER(resp, response_message) {
inter_name *iname = Responses::response_constant_iname(resp->responding_rule,
resp->response_marker);
inter_name *iname = Responses::response_constant_iname(resp->the_rule,
resp->the_marker);
EmitCode::inv(IF_BIP);
EmitCode::down();
EmitCode::inv(EQ_BIP);
@ -346,7 +396,7 @@ say |R_14_RESP_B|, we print its current text, say response (B) for |R_14|.
EmitCode::down();
EmitCode::call(Hierarchy::find(RULEPRINTINGRULE_HL));
EmitCode::down();
EmitCode::val_iname(K_value, RTRules::iname(resp->responding_rule));
EmitCode::val_iname(K_value, RTRules::iname(resp->the_rule));
EmitCode::up();
EmitCode::inv(PRINT_BIP);
EmitCode::down();
@ -354,7 +404,7 @@ say |R_14_RESP_B|, we print its current text, say response (B) for |R_14|.
EmitCode::up();
EmitCode::inv(PRINTCHAR_BIP);
EmitCode::down();
EmitCode::val_number((inter_ti) ('A' + resp->response_marker));
EmitCode::val_number((inter_ti) ('A' + resp->the_marker));
EmitCode::up();
EmitCode::inv(PRINT_BIP);
EmitCode::down();
@ -366,7 +416,7 @@ say |R_14_RESP_B|, we print its current text, say response (B) for |R_14|.
Functions::end(save);
@ The following array is used only by the testing command RESPONSES, and
enables the I6 template to print out all known responses at run-time,
enables the Inter template to print out all known responses at run-time,
divided up by the extensions containing the rules which produce them.
@<Compile the Response Divisions array@> =
@ -414,144 +464,3 @@ divided up by the extensions containing the rules which produce them.
EmitArrays::numeric_entry((inter_ti) (tally-1));
contiguous_match = FALSE;
}
@ =
stack_frame *Responses::frame_for_response(response_message *resp) {
if (resp == NULL) return NULL;
return resp->original_stack_frame;
}
@ As mentioned above, assertions in the source text can change the text of
a given response even at compile time. But the rules code looks after that:
=
void Responses::assert_response_value(rule *R, int marker, wording W) {
Rules::now_rule_needs_response(R, marker, W);
}
@ When we index a response, we also provide a paste button for the source
text to assert a change:
=
void Responses::index_response(OUTPUT_STREAM, rule *R, int marker, response_message *resp) {
WRITE("&nbsp;&nbsp;&nbsp;&nbsp;");
HTML_OPEN_WITH("span",
"style=\"color: #ffffff; "
"font-family: 'Courier New', Courier, monospace; background-color: #8080ff;\"");
WRITE("&nbsp;&nbsp;%c&nbsp;&nbsp; ", 'A' + marker);
HTML_CLOSE("span");
HTML_OPEN_WITH("span", "style=\"color: #000066;\"");
WRITE("%+W", resp->original_text->unsubstituted_text);
HTML_CLOSE("span");
WRITE("&nbsp;&nbsp;");
TEMPORARY_TEXT(S)
WRITE_TO(S, "%+W response (%c)", R->name, 'A' + marker);
PasteButtons::paste_text(OUT, S);
WRITE("&nbsp;<i>name</i>");
WRITE("&nbsp;");
Str::clear(S);
WRITE_TO(S, "The %+W response (%c) is \"New text.\".");
PasteButtons::paste_text(OUT, S);
WRITE("&nbsp;<i>set</i>");
DISCARD_TEXT(S)
}
@ =
int Responses::get_marker_from_response_spec(parse_node *rs) {
if (Rvalues::is_CONSTANT_of_kind(rs, K_response)) {
wording SW = Node::get_text(rs);
if ((Wordings::length(SW) >= 2) && (<response-letter>(Wordings::one_word(Wordings::last_wn(SW)-1))))
return <<r>>;
}
return -1;
}
@ To complete the code on strings, we just need the top-level routine which
handles the compilation of a general string literal. There are actually three
ways we might not even be compiling an I7 text value here:
(a) If the specification is flagged "explicit", we're using this as a device
to hold low-level I6 property values such as |parse_name| routines, and we
simply compile the text raw.
(b) If we're in quotation mode, that means the text is destined to be in an
I6 "box" statement, which needs it to be formed in an eccentric way.
(c) If we're in bibliographic mode, we're compiling not to the I6 program
but to something like an XML description of its metadata, where again the
text needs to be printed in a particular way.
=
void Responses::compile_general(value_holster *VH, parse_node *str) {
wording SW = Node::get_text(str);
if (Annotations::read_int(str, explicit_literal_ANNOT)) {
if (Node::get_explicit_iname(str)) {
if (Holsters::non_void_context(VH)) {
Emit::holster_iname(VH, Node::get_explicit_iname(str));
} else internal_error("unvalued SCG");
} else {
int A = Annotations::read_int(str, constant_number_ANNOT);
if (Holsters::non_void_context(VH))
Holsters::holster_pair(VH, LITERAL_IVAL, (inter_ti) A);
}
} else {
if (Wordings::empty(SW)) internal_error("Text no longer available for CONSTANT/TEXT");
@<This is going to make a valid I7 text value@>;
}
}
@ Responses take the form
= (text)
"blah blah blah" ( letter )
=
so the penultimate word, if it's there, is the letter.
@<This is going to make a valid I7 text value@> =
if ((Wordings::length(SW) >= 2) && (<response-letter>(Wordings::one_word(Wordings::last_wn(SW)-1))))
@<This is a response@>
else @<This isn't a response@>;
@<This is a response@> =
int code = <<r>>;
if ((rule_being_compiled == NULL) ||
(Rules::rule_allows_responses(rule_being_compiled) == FALSE)) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseContextWrong),
"lettered responses can only be used in named rules",
"not in any of the other contexts in which quoted text can appear.");
return;
}
if (Rules::get_response(rule_being_compiled, code)) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_ResponseDuplicated),
"this duplicates a response letter",
"which is not allowed: if a bracketed letter like (A) is used to mark "
"some text as a response, then it can only occur once in its rule.");
return;
}
stack_frame *frame = Frames::current_stack_frame();
if (Holsters::non_void_context(VH)) {
int downs = LocalParking::park(frame);
response_message *resp =
Responses::response_cue(VH, rule_being_compiled, code, SW,
Frames::boxed_frame(frame), FALSE);
Rules::set_response(rule_being_compiled, code, resp);
while (downs > 0) { EmitCode::up(); downs--; }
}
@<This isn't a response@> =
if (Annotations::read_int(str, text_unescaped_ANNOT)) {
if (CompileValues::compiling_in_constant_mode()) {
inter_name *val_iname = TextLiterals::to_value_unescaped(SW);
Emit::holster_iname(VH, val_iname);
} else {
inter_name *val_iname = TextLiterals::to_value_unescaped(SW);
Emit::holster_iname(VH, val_iname);
}
} else if (Vocabulary::test_flags(Wordings::first_wn(SW), TEXTWITHSUBS_MC)) {
TextSubstitutions::text_substitution_cue(VH, SW);
} else {
if (CompileValues::compiling_in_constant_mode()) {
inter_name *val_iname = TextLiterals::to_value(SW);
Emit::holster_iname(VH, val_iname);
} else {
inter_name *val_iname = TextLiterals::to_value(SW);
Emit::holster_iname(VH, val_iname);
}
}

View file

@ -35,11 +35,15 @@ it will always be a function.
=
inter_name *TextLiterals::small_block(inter_name *content) {
inter_name *small_block = Enclosures::new_small_block_for_constant();
packaging_state save = EmitArrays::begin(small_block, K_value);
TextLiterals::compile_value_to(small_block, content);
return small_block;
}
void TextLiterals::compile_value_to(inter_name *at, inter_name *content) {
packaging_state save = EmitArrays::begin(at, K_value);
EmitArrays::iname_entry(Hierarchy::find(CONSTANT_PACKED_TEXT_STORAGE_HL));
EmitArrays::iname_entry(content);
EmitArrays::end(save);
return small_block;
}
@h Default value.

View file

@ -130,7 +130,6 @@ typedef struct text_substitution {
struct stack_frame *using_frame; /* for cases where possible */
struct inter_name *ts_value_iname; /* the I6 array for this */
int ts_value_iname_used;
struct inter_name *ts_function_iname; /* the routine to implement it */
struct rule *responding_to_rule;
@ -145,13 +144,9 @@ typedef struct text_substitution {
value ----------------> CONSTANT_PACKED_TEXT_STORAGE or CONSTANT_PERISHABLE_TEXT_STORAGE
function ----------------------> ...
=
While the function is always compiled, the small block is only compiled if
the value iname is ever actually requested. (Sometimes when making alternative
responses we just want to make the function.)
=
inter_name *TextSubstitutions::value_iname(text_substitution *ts) {
ts->ts_value_iname_used = TRUE;
return ts->ts_value_iname;
}
@ -159,7 +154,8 @@ inter_name *TextSubstitutions::function_iname(text_substitution *ts) {
return ts->ts_function_iname;
}
@
@ Note that this function is called both when cues are detected (above), and
also when responses are created -- see //Responses//.
=
text_substitution *TextSubstitutions::new_text_substitution(wording W,
@ -170,9 +166,8 @@ text_substitution *TextSubstitutions::new_text_substitution(wording W,
internal_error("Too late for further text substitutions");
ts->unsubstituted_text = Wordings::first_word(W);
ts->sentence_using_this = current_sentence;
if (R) {
ts->using_frame = NULL;
} else {
ts->using_frame = NULL;
if (R == NULL) {
stack_frame new_frame = Frames::new();
ts->using_frame = Frames::boxed_frame(&new_frame);
if (frame) LocalVariableSlates::append(ts->using_frame, frame);
@ -190,7 +185,6 @@ text_substitution *TextSubstitutions::new_text_substitution(wording W,
if (R) P = RTRules::package(R);
package_request *PR = Hierarchy::package_within(LITERALS_HAP, P);
ts->ts_value_iname = Hierarchy::make_iname_in(TEXT_SUBSTITUTION_HL, PR);
ts->ts_value_iname_used = FALSE;
ts->ts_function_iname = Hierarchy::make_iname_in(TEXT_SUBSTITUTION_FN_HL, PR);
ts->owning_point = current_sentence;
@ -202,16 +196,13 @@ text_substitution *TextSubstitutions::new_text_substitution(wording W,
}
@h Compilation.
Functions for substitutions are then compiled in due course by the following coroutine
(see //core: How To Compile//):
=
int TextSubstitutions::compilation_coroutine(void) {
return TextSubstitutions::compile_as_needed(FALSE);
}
text_substitution *latest_ts_compiled = NULL;
int compiling_text_routines_mode = FALSE; /* used for better problem messages */
int TextSubstitutions::compile_as_needed(int in_response_mode) {
Responses::compile_response_launchers();
int TextSubstitutions::compilation_coroutine(void) {
int N = 0;
compiling_text_routines_mode = TRUE;
while (TRUE) {
@ -220,13 +211,11 @@ int TextSubstitutions::compile_as_needed(int in_response_mode) {
else ts = NEXT_OBJECT(latest_ts_compiled, text_substitution);
if (ts == NULL) break;
latest_ts_compiled = ts;
int responding = FALSE;
if (ts->responding_to_rule) responding = TRUE;
if ((responding == in_response_mode) && (ts->tr_done_already == FALSE)) {
if (ts->tr_done_already == FALSE) {
ts->tr_done_already = TRUE;
int makes_local_refs = TextSubstitutions::compile_function(ts);
if (ts->ts_value_iname_used)
TextSubstitutions::compile_value(ts->ts_value_iname, ts->ts_function_iname, makes_local_refs);
TextSubstitutions::compile_value(ts->ts_value_iname,
ts->ts_function_iname, makes_local_refs);
}
N++;
}
@ -252,34 +241,30 @@ int TextSubstitutions::compile_function(text_substitution *ts) {
current_ts_being_compiled = ts;
packaging_state save = Functions::begin(ts->ts_function_iname);
stack_frame *frame = ts->using_frame;
if ((ts->responding_to_rule) && (ts->responding_to_marker >= 0)) {
response_message *resp = Rules::get_response(
ts->responding_to_rule, ts->responding_to_marker);
if (resp) frame = Responses::frame_for_response(resp);
}
if (frame) LocalVariableSlates::append(Frames::current_stack_frame(), frame);
stack_frame *frame = NULL;
@<Give the function access to shared variables visible to its user@>;
LocalVariables::monitor_local_parsing(Frames::current_stack_frame());
@<Compile some debugging text@>;
@<Compile a say-phrase@>;
int makes_local_references =
LocalVariables::local_parsed_recently(Frames::current_stack_frame());
if (makes_local_references) {
Produce::push_code_position(Emit::tree(), Produce::begin_position(Emit::tree()), Inter::Bookmarks::snapshot(Emit::at()));
LocalParking::retrieve(frame);
Produce::pop_code_position(Emit::tree());
}
if (makes_local_references) @<Insert code at start of function to retrieve parked values@>;
Functions::end(save);
current_ts_being_compiled = NULL;
return makes_local_references;
}
@ Of course, if we used Inform's standard phrase mechanism exactly, then
the whole thing would be circular, because that would once again generate
a request for a new text substitution to be compiled later...
@<Give the function access to shared variables visible to its user@> =
frame = Responses::frame_for_response(ts->responding_to_rule, ts->responding_to_marker);
if (frame == NULL) frame = ts->using_frame;
if (frame) LocalVariableSlates::append(Frames::current_stack_frame(), frame);
@<Compile a say-phrase@> =
@ In DEBUG mode, there's an option to print the unsubstituted text instead --
note the |rtrue| here, which stops the function from proceeding.
@<Compile some debugging text@> =
if (TargetVMs::debug_enabled(Task::vm())) {
EmitCode::inv(IFDEBUG_BIP);
EmitCode::down();
@ -287,7 +272,8 @@ a request for a new text substitution to be compiled later...
EmitCode::down();
EmitCode::inv(IF_BIP);
EmitCode::down();
EmitCode::val_iname(K_number, Hierarchy::find(SUPPRESS_TEXT_SUBSTITUTION_HL));
EmitCode::val_iname(K_number,
Hierarchy::find(SUPPRESS_TEXT_SUBSTITUTION_HL));
EmitCode::code();
EmitCode::down();
EmitCode::inv(PRINT_BIP);
@ -304,6 +290,11 @@ a request for a new text substitution to be compiled later...
EmitCode::up();
}
@ Of course, if we used Inform's standard phrase mechanism exactly, then
the whole thing would be circular, because that would once again generate
a request for a new text substitution to be compiled later...
@<Compile a say-phrase@> =
parse_node *ts_code_block = Node::new(IMPERATIVE_NT);
CompilationUnits::assign_to_same_unit(ts_code_block, ts->owning_point);
ts_code_block->next = Node::new(UNKNOWN_NT);
@ -315,17 +306,17 @@ a request for a new text substitution to be compiled later...
EmitCode::rtrue();
@ See the "Responses" section for why, but we sometimes want to force
the coroutine to go through the whole queue once, then go back to the
start again -- which would be very inefficient except that in this mode
we aren't doing very much; most TSs will be passed quickly over.
@ Where a text substitution refers to local variables in the caller,
//imperative: Local Parking// is used to pass it the current values of those
locals; and this means that the function must begin by retrieving those values.
But since we have already compiled most of the function, we have to go back to
the start temporarily to insert this extra code.
=
void TextSubstitutions::compile_text_routines_in_response_mode(void) {
latest_ts_compiled = NULL;
TextSubstitutions::compile_as_needed(TRUE);
latest_ts_compiled = NULL;
}
@<Insert code at start of function to retrieve parked values@> =
Produce::push_code_position(Emit::tree(),
Produce::begin_position(Emit::tree()), Inter::Bookmarks::snapshot(Emit::at()));
LocalParking::retrieve(frame);
Produce::pop_code_position(Emit::tree());
@h It may be worth adding.
Finally, the following clarifies problem messages arising from the issue of

View file

@ -76,6 +76,15 @@ property *Rvalues::to_property(parse_node *spec) {
CONV_TO(property) }
rule *Rvalues::to_rule(parse_node *spec) {
CONV_TO(rule) }
int Rvalues::to_response_marker(parse_node *spec) {
if (Rvalues::is_CONSTANT_of_kind(spec, K_response)) {
wording SW = Node::get_text(spec);
if ((Wordings::length(SW) >= 2) &&
(<response-letter>(Wordings::one_word(Wordings::last_wn(SW)-1))))
return <<r>>;
}
return -1;
}
rulebook *Rvalues::to_rulebook(parse_node *spec) {
CONV_TO(rulebook) }
table *Rvalues::to_table(parse_node *spec) {