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:
parent
d71f3bdf50
commit
11f053a502
|
@ -463,10 +463,8 @@ will be required to pass <span class="extract"><span class="extract-syntax"><
|
|||
<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">-></span><span class="identifier-syntax">down</span><span class="plain-syntax">-></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"><extra-response></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"><<r>></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"><<r>></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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"> < </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">code</span><span class="plain-syntax"> >= </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">-></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">§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"> < </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">code</span><span class="plain-syntax"> >= </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">-></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">§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"> < </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">code</span><span class="plain-syntax"> >= </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">-></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>
|
||||
|
|
|
@ -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">() > </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">() > </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">() > </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">() > </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">() > </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">() > </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>
|
||||
|
||||
|
|
|
@ -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">§1.3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§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">§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">) >= </span><span class="constant-syntax">2</span><span class="plain-syntax">) &&</span>
|
||||
<span class="plain-syntax"> (</span><span class="function-syntax"><response-letter></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">) &&</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>§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">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>§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"><<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">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">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_3" class="paragraph-anchor"></a><b>§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">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_4" class="paragraph-anchor"></a><b>§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">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_5" class="paragraph-anchor"></a><b>§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">§2</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="2-cv.html">❮</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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -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"> & </span><span class="identifier-syntax">ADOPT_LOCAL_STACK_FRAME_ISSBM</span><span class="plain-syntax">) &&</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">-></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">-></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">-></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">-></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"> & </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">-></span><span class="identifier-syntax">term_checked_as_kind</span><span class="plain-syntax">;</span>
|
||||
|
|
|
@ -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">-></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">-></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">-></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">-></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"> > </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>§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">§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">"&nbsp;&nbsp;&nbsp;&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">"&nbsp;&nbsp;%c&nbsp;&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">-></span><span class="identifier-syntax">the_ts</span><span class="plain-syntax">-></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">"&nbsp;&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">-></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">"&nbsp;<i>name</i>"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&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">"&nbsp;<i>set</i>"</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">❮</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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -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">§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">§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>
|
||||
|
|
|
@ -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">§1</a>, <a href="4-ll.html#SP2">§2</a><br/>Text Literals - <a href="4-tl.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">§1</a><br/>Responses - <a href="4-rsp.html#SP5_1">§5.1</a>, <a href="4-rsp.html#SP6_3">§6.3</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">§2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">§18.1</a><br/>List Together - <a href="5-lt.html#SP3_1">§3.1</a><br/>Rules - <a href="5-rls.html#SP8_1_1">§8.1.1</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP9">§9</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a>, <a href="6-tm.html#SP3">§3</a><br/>Actions - <a href="7-act.html#SP1">§1</a><br/>Parsing - <a href="8-prs.html#SP2">§2</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§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">§1</a>, <a href="4-ll.html#SP2">§2</a><br/>Text Literals - <a href="4-tl.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">§1</a><br/>Responses - <a href="4-rsp.html#SP7_2">§7.2</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">§2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">§18.1</a><br/>List Together - <a href="5-lt.html#SP3_1">§3.1</a><br/>Rules - <a href="5-rls.html#SP8_1_1">§8.1.1</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP9">§9</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a>, <a href="6-tm.html#SP3">§3</a><br/>Actions - <a href="7-act.html#SP1">§1</a><br/>Parsing - <a href="8-prs.html#SP2">§2</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§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">§1</a>, <a href="4-ll.html#SP2">§2</a>, <a href="4-ll.html#SP7_1">§7.1</a><br/>Responses - <a href="4-rsp.html#SP6_3">§6.3</a>, <a href="4-rsp.html#SP6_3_1_1">§6.3.1.1</a>, <a href="4-rsp.html#SP6_3_1_2">§6.3.1.2</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">§2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§5</a>, <a href="5-rsfk.html#SP11">§11</a>, <a href="5-rsfk.html#SP18_1_1_1">§18.1.1.1</a>, <a href="5-rsfk.html#SP18_1_1_2">§18.1.1.2</a>, <a href="5-rsfk.html#SP22">§22</a><br/>Rules - <a href="5-rls.html#SP8_1_1">§8.1.1</a>, <a href="5-rls.html#SP8_1_2">§8.1.2</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP4_1_3">§4.1.3</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP8">§8</a>, <a href="5-rart.html#SP9_2">§9.2</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1_1_3">§4.1.1.1.1.3</a>, <a href="5-rsft.html#SP4_1_1_1_1_4">§4.1.1.1.1.4</a>, <a href="5-rsft.html#SP4_2_3">§4.2.3</a>, <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a><br/>Timed Rules - <a href="6-tr.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP1">§1</a>, <a href="7-act.html#SP2">§2</a><br/>Action Patterns - <a href="7-ap.html#SP5">§5</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§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">§1</a>, <a href="4-ll.html#SP2">§2</a>, <a href="4-ll.html#SP7_1">§7.1</a><br/>Responses - <a href="4-rsp.html#SP7_2">§7.2</a>, <a href="4-rsp.html#SP7_2_1_1">§7.2.1.1</a>, <a href="4-rsp.html#SP7_2_1_2">§7.2.1.2</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">§2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§5</a>, <a href="5-rsfk.html#SP11">§11</a>, <a href="5-rsfk.html#SP18_1_1_1">§18.1.1.1</a>, <a href="5-rsfk.html#SP18_1_1_2">§18.1.1.2</a>, <a href="5-rsfk.html#SP22">§22</a><br/>Rules - <a href="5-rls.html#SP8_1_1">§8.1.1</a>, <a href="5-rls.html#SP8_1_2">§8.1.2</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP4_1_3">§4.1.3</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP8">§8</a>, <a href="5-rart.html#SP9_2">§9.2</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1_1_3">§4.1.1.1.1.3</a>, <a href="5-rsft.html#SP4_1_1_1_1_4">§4.1.1.1.1.4</a>, <a href="5-rsft.html#SP4_2_3">§4.2.3</a>, <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a><br/>Timed Rules - <a href="6-tr.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP1">§1</a>, <a href="7-act.html#SP2">§2</a><br/>Action Patterns - <a href="7-ap.html#SP5">§5</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§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">§2</a>, <a href="4-ll.html#SP7_2">§7.2</a><br/>Text Literals - <a href="4-tl.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">§1</a><br/>Responses - <a href="4-rsp.html#SP5_1">§5.1</a>, <a href="4-rsp.html#SP6_3_1_1">§6.3.1.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§5</a>, <a href="5-rsfk.html#SP11">§11</a>, <a href="5-rsfk.html#SP14">§14</a>, <a href="5-rsfk.html#SP22">§22</a><br/>List Together - <a href="5-lt.html#SP3_1">§3.1</a><br/>Rules - <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_2">§4.1.2</a>, <a href="5-rart.html#SP4_1_2_1">§4.1.2.1</a>, <a href="5-rart.html#SP4_1_3">§4.1.3</a>, <a href="5-rart.html#SP4_1_6">§4.1.6</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP9_2">§9.2</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">§4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1_5">§4.1.1.1.1.5</a>, <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a>, <a href="6-tm.html#SP3">§3</a><br/>Timed Rules - <a href="6-tr.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP2">§2</a>, <a href="7-act.html#SP3">§3</a><br/>Action Patterns - <a href="7-ap.html#SP5">§5</a><br/>Command Grammar Lines - <a href="8-cgl.html#SP2">§2</a>, <a href="8-cgl.html#SP5">§5</a>, <a href="8-cgl.html#SP7">§7</a>, <a href="8-cgl.html#SP10">§10</a><br/>Noun Filter Tokens - <a href="8-nft.html#SP3">§3</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§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">§2</a>, <a href="4-ll.html#SP7_2">§7.2</a><br/>Text Literals - <a href="4-tl.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">§1</a><br/>Responses - <a href="4-rsp.html#SP7_2_1_1">§7.2.1.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§5</a>, <a href="5-rsfk.html#SP11">§11</a>, <a href="5-rsfk.html#SP14">§14</a>, <a href="5-rsfk.html#SP22">§22</a><br/>List Together - <a href="5-lt.html#SP3_1">§3.1</a><br/>Rules - <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_2">§4.1.2</a>, <a href="5-rart.html#SP4_1_2_1">§4.1.2.1</a>, <a href="5-rart.html#SP4_1_3">§4.1.3</a>, <a href="5-rart.html#SP4_1_6">§4.1.6</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP9_2">§9.2</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">§4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1_5">§4.1.1.1.1.5</a>, <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a>, <a href="6-tm.html#SP3">§3</a><br/>Timed Rules - <a href="6-tr.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP2">§2</a>, <a href="7-act.html#SP3">§3</a><br/>Action Patterns - <a href="7-ap.html#SP5">§5</a><br/>Command Grammar Lines - <a href="8-cgl.html#SP2">§2</a>, <a href="8-cgl.html#SP5">§5</a>, <a href="8-cgl.html#SP7">§7</a>, <a href="8-cgl.html#SP10">§10</a><br/>Noun Filter Tokens - <a href="8-nft.html#SP3">§3</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§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">§6.3.1.1</a><br/>Rules - <a href="5-rls.html#SP12">§12</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_1">§4.1.1</a>, <a href="5-rart.html#SP4_1_5">§4.1.5</a>, <a href="5-rart.html#SP5">§5</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§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">§7.2.1.1</a><br/>Rules - <a href="5-rls.html#SP12">§12</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_1">§4.1.1</a>, <a href="5-rart.html#SP4_1_5">§4.1.5</a>, <a href="5-rart.html#SP5">§5</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§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">(), &</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">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">§1</a>, <a href="4-ll.html#SP2">§2</a><br/>Text Literals - <a href="4-tl.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">§1</a><br/>Responses - <a href="4-rsp.html#SP5_1">§5.1</a>, <a href="4-rsp.html#SP6_3">§6.3</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">§2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§5</a>, <a href="5-rsfk.html#SP18_1">§18.1</a><br/>List Together - <a href="5-lt.html#SP3_1">§3.1</a><br/>Rules - <a href="5-rls.html#SP8_1_5">§8.1.5</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP4_1_2">§4.1.2</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP9">§9</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">§4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1">§4.1.1.1.1</a>, <a href="5-rsft.html#SP4_2">§4.2</a>, <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a>, <a href="6-tm.html#SP3">§3</a><br/>Timed Rules - <a href="6-tr.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP1">§1</a>, <a href="7-act.html#SP2">§2</a><br/>Action Patterns - <a href="7-ap.html#SP5">§5</a><br/>Parsing - <a href="8-prs.html#SP2">§2</a><br/>Command Grammars - <a href="8-cg.html#SP7">§7</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§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">§1</a>, <a href="4-ll.html#SP2">§2</a><br/>Text Literals - <a href="4-tl.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">§1</a><br/>Responses - <a href="4-rsp.html#SP7_2">§7.2</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">§2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§5</a>, <a href="5-rsfk.html#SP18_1">§18.1</a><br/>List Together - <a href="5-lt.html#SP3_1">§3.1</a><br/>Rules - <a href="5-rls.html#SP8_1_5">§8.1.5</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP4_1_2">§4.1.2</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP9">§9</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">§4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1">§4.1.1.1.1</a>, <a href="5-rsft.html#SP4_2">§4.2</a>, <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a>, <a href="6-tm.html#SP3">§3</a><br/>Timed Rules - <a href="6-tr.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP1">§1</a>, <a href="7-act.html#SP2">§2</a><br/>Action Patterns - <a href="7-ap.html#SP5">§5</a><br/>Parsing - <a href="8-prs.html#SP2">§2</a><br/>Command Grammars - <a href="8-cg.html#SP7">§7</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§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
|
@ -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">)-></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">§4</a>, <a href="2-emt.html#SP5">§5</a>, <a href="2-emt.html#SP7">§7</a>, <a href="2-emt.html#SP8">§8</a>, <a href="2-emt.html#SP9">§9</a>, <a href="2-emt.html#SP10">§10</a>, <a href="2-emt.html#SP11">§11</a>, <a href="2-emt.html#SP12">§12</a>, <a href="2-emt.html#SP14">§14</a>, <a href="2-emt.html#SP15">§15</a>, <a href="2-emt.html#SP16">§16</a>, <a href="2-emt.html#SP17">§17</a>, <a href="2-emt.html#SP19">§19</a>, <a href="2-emt.html#SP22">§22</a><br/>Hierarchy - <a href="2-hrr.html#SP1">§1</a>, <a href="2-hrr.html#SP2">§2</a>, <a href="2-hrr.html#SP9">§9</a>, <a href="2-hrr.html#SP11">§11</a>, <a href="2-hrr.html#SP12">§12</a>, <a href="2-hrr.html#SP13">§13</a>, <a href="2-hrr.html#SP14">§14</a>, <a href="2-hrr.html#SP15">§15</a>, <a href="2-hrr.html#SP16">§16</a>, <a href="2-hrr.html#SP17">§17</a>, <a href="2-hrr.html#SP18">§18</a>, <a href="2-hrr.html#SP19">§19</a>, <a href="2-hrr.html#SP20">§20</a>, <a href="2-hrr.html#SP21">§21</a>, <a href="2-hrr.html#SP22">§22</a>, <a href="2-hrr.html#SP23">§23</a><br/>Compilation Units - <a href="2-cu.html#SP2_1">§2.1</a><br/>Emit Code - <a href="2-ec.html#SP2">§2</a>, <a href="2-ec.html#SP3">§3</a>, <a href="2-ec.html#SP4">§4</a>, <a href="2-ec.html#SP5">§5</a>, <a href="2-ec.html#SP7">§7</a>, <a href="2-ec.html#SP8">§8</a>, <a href="2-ec.html#SP9">§9</a>, <a href="2-ec.html#SP10">§10</a>, <a href="2-ec.html#SP11">§11</a>, <a href="2-ec.html#SP12">§12</a>, <a href="2-ec.html#SP13">§13</a><br/>Emit Arrays - <a href="2-ea.html#SP4">§4</a>, <a href="2-ea.html#SP6">§6</a><br/>Enclosures - <a href="4-enc.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP7">§7</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§5</a>, <a href="5-rsfk.html#SP6">§6</a>, <a href="5-rsfk.html#SP9">§9</a>, <a href="5-rsfk.html#SP26">§26</a><br/>Rules - <a href="5-rls.html#SP2">§2</a><br/>Variables - <a href="5-vrb.html#SP1">§1</a>, <a href="5-vrb.html#SP8">§8</a><br/>Relations at Run Time - <a href="5-rart.html#SP18">§18</a><br/>Command Grammars - <a href="8-cg.html#SP1">§1</a><br/>Command Grammar Lines - <a href="8-cgl.html#SP10">§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">§4</a>, <a href="2-emt.html#SP5">§5</a>, <a href="2-emt.html#SP7">§7</a>, <a href="2-emt.html#SP8">§8</a>, <a href="2-emt.html#SP9">§9</a>, <a href="2-emt.html#SP10">§10</a>, <a href="2-emt.html#SP11">§11</a>, <a href="2-emt.html#SP12">§12</a>, <a href="2-emt.html#SP14">§14</a>, <a href="2-emt.html#SP15">§15</a>, <a href="2-emt.html#SP16">§16</a>, <a href="2-emt.html#SP17">§17</a>, <a href="2-emt.html#SP19">§19</a>, <a href="2-emt.html#SP22">§22</a><br/>Hierarchy - <a href="2-hrr.html#SP1">§1</a>, <a href="2-hrr.html#SP2">§2</a>, <a href="2-hrr.html#SP9">§9</a>, <a href="2-hrr.html#SP11">§11</a>, <a href="2-hrr.html#SP12">§12</a>, <a href="2-hrr.html#SP13">§13</a>, <a href="2-hrr.html#SP14">§14</a>, <a href="2-hrr.html#SP15">§15</a>, <a href="2-hrr.html#SP16">§16</a>, <a href="2-hrr.html#SP17">§17</a>, <a href="2-hrr.html#SP18">§18</a>, <a href="2-hrr.html#SP19">§19</a>, <a href="2-hrr.html#SP20">§20</a>, <a href="2-hrr.html#SP21">§21</a>, <a href="2-hrr.html#SP22">§22</a>, <a href="2-hrr.html#SP23">§23</a><br/>Compilation Units - <a href="2-cu.html#SP2_1">§2.1</a><br/>Emit Code - <a href="2-ec.html#SP2">§2</a>, <a href="2-ec.html#SP3">§3</a>, <a href="2-ec.html#SP4">§4</a>, <a href="2-ec.html#SP5">§5</a>, <a href="2-ec.html#SP7">§7</a>, <a href="2-ec.html#SP8">§8</a>, <a href="2-ec.html#SP9">§9</a>, <a href="2-ec.html#SP10">§10</a>, <a href="2-ec.html#SP11">§11</a>, <a href="2-ec.html#SP12">§12</a>, <a href="2-ec.html#SP13">§13</a><br/>Emit Arrays - <a href="2-ea.html#SP4">§4</a>, <a href="2-ea.html#SP6">§6</a><br/>Enclosures - <a href="4-enc.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP7_4">§7.4</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§5</a>, <a href="5-rsfk.html#SP6">§6</a>, <a href="5-rsfk.html#SP9">§9</a>, <a href="5-rsfk.html#SP26">§26</a><br/>Rules - <a href="5-rls.html#SP2">§2</a><br/>Variables - <a href="5-vrb.html#SP1">§1</a>, <a href="5-vrb.html#SP8">§8</a><br/>Relations at Run Time - <a href="5-rart.html#SP18">§18</a><br/>Command Grammars - <a href="8-cg.html#SP1">§1</a><br/>Command Grammar Lines - <a href="8-cgl.html#SP10">§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">§3</a>, <a href="2-emt.html#SP6">§6</a>, <a href="2-emt.html#SP7">§7</a>, <a href="2-emt.html#SP9">§9</a>, <a href="2-emt.html#SP10">§10</a>, <a href="2-emt.html#SP11">§11</a>, <a href="2-emt.html#SP14">§14</a>, <a href="2-emt.html#SP15">§15</a>, <a href="2-emt.html#SP16">§16</a>, <a href="2-emt.html#SP17">§17</a>, <a href="2-emt.html#SP18">§18</a>, <a href="2-emt.html#SP19">§19</a>, <a href="2-emt.html#SP20">§20</a>, <a href="2-emt.html#SP21">§21</a>, <a href="2-emt.html#SP22">§22</a><br/>Emit Arrays - <a href="2-ea.html#SP11">§11</a><br/>Text Substitutions - <a href="4-ts.html#SP7">§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">§3</a>, <a href="2-emt.html#SP6">§6</a>, <a href="2-emt.html#SP7">§7</a>, <a href="2-emt.html#SP9">§9</a>, <a href="2-emt.html#SP10">§10</a>, <a href="2-emt.html#SP11">§11</a>, <a href="2-emt.html#SP14">§14</a>, <a href="2-emt.html#SP15">§15</a>, <a href="2-emt.html#SP16">§16</a>, <a href="2-emt.html#SP17">§17</a>, <a href="2-emt.html#SP18">§18</a>, <a href="2-emt.html#SP19">§19</a>, <a href="2-emt.html#SP20">§20</a>, <a href="2-emt.html#SP21">§21</a>, <a href="2-emt.html#SP22">§22</a><br/>Emit Arrays - <a href="2-ea.html#SP11">§11</a><br/>Text Substitutions - <a href="4-ts.html#SP7_4">§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">§2.2</a><br/>Responses - <a href="4-rsp.html#SP11">§11</a>, <a href="4-rsp.html#SP11_1_2">§11.1.2</a><br/>Box Quotations - <a href="4-bq.html#SP1">§1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§5</a><br/>Actions - <a href="7-act.html#SP5">§5</a><br/>Action Patterns - <a href="7-ap.html#SP5">§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">§2.2</a><br/>Box Quotations - <a href="4-bq.html#SP1">§1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§5</a><br/>Actions - <a href="7-act.html#SP5">§5</a><br/>Action Patterns - <a href="7-ap.html#SP5">§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">(&</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -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>§1. </b>Responses are texts — which may be either literals or text substitutions —
|
||||
<ul class="toc"><li><a href="4-rsp.html#SP1">§1. Introduction</a></li><li><a href="4-rsp.html#SP4">§4. How rules gain responses</a></li><li><a href="4-rsp.html#SP6">§6. Compilation</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Introduction. </b>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:
|
||||
</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>§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>§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">§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">-></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>§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">§5.1</a>, <a href="4-rsp.html#SP6_1">§6.1</a>, <a href="4-rsp.html#SP6_2">§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">-></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">-></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>§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 — 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">§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">§4</a>, <a href="4-rsp.html#SP5">§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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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>§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>§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">§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">§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">-></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">§6.1</a>, <a href="4-rsp.html#SP7_1">§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">-></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">-></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">§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">-></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>§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"> > </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>§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">-></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>§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">-></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">-></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">-></span><span class="element-syntax">via_I6</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></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">-></span><span class="element-syntax">via_Inter</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></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">-></span><span class="element-syntax">the_rule</span><span class="plain-syntax"> == </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></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">-></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>§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>§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">-></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 ----------------> CONSTANT_PACKED_TEXT_STORAGE</span>
|
||||
<span class="plain-syntax"> launcher function ----------------------> ...</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">-></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">-></span><span class="element-syntax">the_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></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">-></span><span class="element-syntax">the_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></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">-></span><span class="element-syntax">value_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></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">-></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">-></span><span class="element-syntax">responding_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></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">-></span><span class="element-syntax">the_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></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">-></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">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5_2" class="paragraph-anchor"></a><b>§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">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_2" class="paragraph-anchor"></a><b>§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">-></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">-></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">-></span><span class="element-syntax">responding_rule</span><span class="plain-syntax"> == </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></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">-></span><span class="element-syntax">the_rule</span><span class="plain-syntax"> == </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></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">-></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">-></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">-></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">-></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">-></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">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§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">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§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>§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"> < </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">-></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">-></span><span class="element-syntax">original_text</span><span class="plain-syntax">-></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">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_2" class="paragraph-anchor"></a><b>§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>§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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_3" class="paragraph-anchor"></a><b>§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">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>§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">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_3_1" class="paragraph-anchor"></a><b>§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">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2_1" class="paragraph-anchor"></a><b>§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">-></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">§6.3</a> (twice).</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_3_1_1" class="paragraph-anchor"></a><b>§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">§7.2</a> (twice).</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2_1_1" class="paragraph-anchor"></a><b>§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">§6.3.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_3_1_2" class="paragraph-anchor"></a><b>§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">§7.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2_1_2" class="paragraph-anchor"></a><b>§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">§6.3.1</a> (twice).</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§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">§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">-></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>§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>§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">"&nbsp;&nbsp;&nbsp;&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">"&nbsp;&nbsp;%c&nbsp;&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">-></span><span class="element-syntax">original_text</span><span class="plain-syntax">-></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">"&nbsp;&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">-></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">"&nbsp;<i>name</i>"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&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">"&nbsp;<i>set</i>"</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>§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">) >= </span><span class="constant-syntax">2</span><span class="plain-syntax">) && (</span><span class="function-syntax"><response-letter></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"><<r>></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>§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>§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">) >= </span><span class="constant-syntax">2</span><span class="plain-syntax">) && (</span><span class="function-syntax"><response-letter></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">§11</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP11_1_1" class="paragraph-anchor"></a><b>§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"><<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">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"> > </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">§11.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP11_1_2" class="paragraph-anchor"></a><b>§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">§11.1</a>.</li></ul>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP7_2_1">§7.2.1</a> (twice).</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-ts.html">❮</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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -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">§2</a>, <a href="4-tl.html#SP4">§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">§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>§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">§4</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§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">§4</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP5">§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">§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">§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"> >= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &&</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">§12</a><br/>Responses - <a href="4-rsp.html#SP11_1_2">§11.1.2</a><br/>Action Patterns - <a href="7-ap.html#SP5">§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">§12</a><br/>Action Patterns - <a href="7-ap.html#SP5">§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">§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>
|
||||
|
||||
|
|
|
@ -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">§1. Runtime representation</a></li><li><a href="4-ts.html#SP2">§2. Cues</a></li><li><a href="4-ts.html#SP3">§3. Substitutions</a></li><li><a href="4-ts.html#SP6">§6. Compilation</a></li><li><a href="4-ts.html#SP9">§9. It may be worth adding</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="4-ts.html#SP1">§1. Runtime representation</a></li><li><a href="4-ts.html#SP2">§2. Cues</a></li><li><a href="4-ts.html#SP3">§3. Substitutions</a></li><li><a href="4-ts.html#SP6">§6. Compilation</a></li><li><a href="4-ts.html#SP8">§8. It may be worth adding</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§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">§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">-></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>§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 ----------------> CONSTANT_PACKED_TEXT_STORAGE or CONSTANT_PERISHABLE_TEXT_STORAGE</span>
|
||||
<span class="plain-syntax"> function ----------------------> ...</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">§2.1</a>, <a href="4-ts.html#SP2_2">§2.2</a><br/>Responses - <a href="4-rsp.html#SP6_1">§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">-></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">§2.1</a>, <a href="4-ts.html#SP2_2">§2.2</a><br/>Responses - <a href="4-rsp.html#SP2">§2</a>, <a href="4-rsp.html#SP6_1">§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">-></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">-></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>§5. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>Note that this function is called both when cues are detected (above), and
|
||||
also when responses are created — 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">§2.1.1</a><br/>Responses - <a href="4-rsp.html#SP4">§4</a>, <a href="4-rsp.html#SP6_1">§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">§2.1.1</a><br/>Responses - <a href="4-rsp.html#SP2">§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">-></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">-></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">-></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">-></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">-></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">(&</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">-></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">-></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">-></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">-></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">-></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>§6. Compilation. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§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">§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">-></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">) && (</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></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">-></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">-></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">-></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">-></span><span class="element-syntax">ts_value_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></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">-></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">-></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">§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">§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">-></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">-></span><span class="element-syntax">using_frame</span><span class="plain-syntax">), </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></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">-></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">-></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">-></span><span class="element-syntax">responding_to_rule</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">responding_to_marker</span><span class="plain-syntax"> >= </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="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">-></span><span class="element-syntax">responding_to_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></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>§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>§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">-></span><span class="element-syntax">responding_to_rule</span><span class="plain-syntax">, </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></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">-></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">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>§7.2. </b>In DEBUG mode, there's an option to print the unsubstituted text instead —
|
||||
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">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_3" class="paragraph-anchor"></a><b>§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">-></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">-></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">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§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 — 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>§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">§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>§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">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§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>§10. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§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">§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">§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">) &&</span>
|
||||
|
|
|
@ -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">§5</a><br/>Responses - <a href="4-rsp.html#SP4">§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">§5</a><br/>Responses - <a href="4-rsp.html#SP2">§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">-></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">-></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">§4.2</a>, <a href="5-rls.html#SP5_2">§5.2</a>, <a href="5-rls.html#SP5_2_1">§5.2.1</a><br/>Emit - <a href="2-emt.html#SP19">§19</a><br/>Responses - <a href="4-rsp.html#SP6_2">§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">§4.2</a>, <a href="5-rls.html#SP5_2">§5.2</a>, <a href="5-rls.html#SP5_2_1">§5.2.1</a><br/>Emit - <a href="2-emt.html#SP19">§19</a><br/>Responses - <a href="4-rsp.html#SP7_1">§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">-></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">-></span><span class="identifier-syntax">defn_as_I7_source</span><span class="plain-syntax">-></span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">-></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">-></span><span class="identifier-syntax">applicability_constraints</span><span class="plain-syntax">) > </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">-></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">§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">§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">-></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">-></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">-></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">-></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>
|
||||
|
|
|
@ -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">§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">) >= </span><span class="constant-syntax">2</span><span class="plain-syntax">) &&</span>
|
||||
<span class="plain-syntax"> (</span><span class="function-syntax"><response-letter></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"><<r>></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">§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">§11</a>, <a href="2-rvl.html#SP12">§12</a>, <a href="2-rvl.html#SP13">§13</a>, <a href="2-rvl.html#SP14">§14</a><br/>Literal Patterns - <a href="3-lp.html#SP24_3">§24.3</a><br/>Enter the S-Parser - <a href="4-ets.html#SP11">§11</a><br/>Constants and Descriptions - <a href="4-cad.html#SP3">§3</a>, <a href="4-cad.html#SP5">§5</a><br/>Type Expressions and Values - <a href="4-teav.html#SP11_2">§11.2</a><br/>Conditions and Phrases - <a href="4-cap.html#SP10_1">§10.1</a><br/>Dash - <a href="5-dsh.html#SP16">§16</a>, <a href="5-dsh.html#SP18_5_2">§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">§3</a>, <a href="2-rvl.html#SP11">§11</a>, <a href="2-rvl.html#SP12">§12</a>, <a href="2-rvl.html#SP13">§13</a>, <a href="2-rvl.html#SP14">§14</a><br/>Literal Patterns - <a href="3-lp.html#SP24_3">§24.3</a><br/>Enter the S-Parser - <a href="4-ets.html#SP11">§11</a><br/>Constants and Descriptions - <a href="4-cad.html#SP3">§3</a>, <a href="4-cad.html#SP5">§5</a><br/>Type Expressions and Values - <a href="4-teav.html#SP11_2">§11.2</a><br/>Conditions and Phrases - <a href="4-cap.html#SP10_1">§10.1</a><br/>Dash - <a href="5-dsh.html#SP16">§16</a>, <a href="5-dsh.html#SP18_5_2">§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">)) &&</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>
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(" ");
|
||||
HTML_OPEN_WITH("span",
|
||||
"style=\"color: #ffffff; "
|
||||
"font-family: 'Courier New', Courier, monospace; background-color: #8080ff;\"");
|
||||
WRITE(" %c ", 'A' + marker);
|
||||
HTML_CLOSE("span");
|
||||
HTML_OPEN_WITH("span", "style=\"color: #000066;\"");
|
||||
WRITE("%+W", resp->the_ts->unsubstituted_text);
|
||||
HTML_CLOSE("span");
|
||||
WRITE(" ");
|
||||
TEMPORARY_TEXT(S)
|
||||
WRITE_TO(S, "%+W response (%c)", R->name, 'A' + marker);
|
||||
PasteButtons::paste_text(OUT, S);
|
||||
WRITE(" <i>name</i>");
|
||||
WRITE(" ");
|
||||
Str::clear(S);
|
||||
WRITE_TO(S, "The %+W response (%c) is \"New text.\".");
|
||||
PasteButtons::paste_text(OUT, S);
|
||||
WRITE(" <i>set</i>");
|
||||
DISCARD_TEXT(S)
|
||||
}
|
||||
|
||||
|
|
|
@ -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(" ");
|
||||
HTML_OPEN_WITH("span",
|
||||
"style=\"color: #ffffff; "
|
||||
"font-family: 'Courier New', Courier, monospace; background-color: #8080ff;\"");
|
||||
WRITE(" %c ", 'A' + marker);
|
||||
HTML_CLOSE("span");
|
||||
HTML_OPEN_WITH("span", "style=\"color: #000066;\"");
|
||||
WRITE("%+W", resp->original_text->unsubstituted_text);
|
||||
HTML_CLOSE("span");
|
||||
WRITE(" ");
|
||||
TEMPORARY_TEXT(S)
|
||||
WRITE_TO(S, "%+W response (%c)", R->name, 'A' + marker);
|
||||
PasteButtons::paste_text(OUT, S);
|
||||
WRITE(" <i>name</i>");
|
||||
WRITE(" ");
|
||||
Str::clear(S);
|
||||
WRITE_TO(S, "The %+W response (%c) is \"New text.\".");
|
||||
PasteButtons::paste_text(OUT, S);
|
||||
WRITE(" <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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue