mirror of
https://github.com/ganelson/inform.git
synced 2024-06-17 07:40:47 +03:00
Simplified text substitutions
This commit is contained in:
parent
62687e54db
commit
d71f3bdf50
|
@ -1,6 +1,6 @@
|
|||
# Inform 7
|
||||
|
||||
v10.1.0-alpha.1+6R88 'Krypton' (22 April 2021)
|
||||
v10.1.0-alpha.1+6R89 'Krypton' (23 April 2021)
|
||||
|
||||
## About Inform 7
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Prerelease: alpha.1
|
||||
Build Date: 22 April 2021
|
||||
Build Number: 6R88
|
||||
Build Date: 23 April 2021
|
||||
Build Number: 6R89
|
||||
|
|
|
@ -464,7 +464,7 @@ will be required to pass <span class="extract"><span class="extract-syntax"><
|
|||
<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">Strings::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">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">else</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">Strings::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><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><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
|
|
|
@ -104,7 +104,7 @@ function togglePopup(material_id) {
|
|||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Conversions. </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">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="reserved-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vh</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Holsters::non_void_context</span><span class="plain-syntax">(</span><span class="reserved-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vh</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">vh</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 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">vh</span><span class="plain-syntax">-></span><span class="element-syntax">vhmode_wanted</span><span class="plain-syntax"> == </span><span class="constant-syntax">INTER_DATA_VHMODE</span><span class="plain-syntax">) ||</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">vh</span><span class="plain-syntax">-></span><span class="element-syntax">vhmode_wanted</span><span class="plain-syntax"> == </span><span class="constant-syntax">INTER_VAL_VHMODE</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>
|
||||
|
|
|
@ -90,8 +90,6 @@ function togglePopup(material_id) {
|
|||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::PackedText::run_pipeline_stage</span><span class="plain-syntax">(</span><span class="reserved-syntax">pipeline_step</span><span class="plain-syntax"> *</span><span class="identifier-syntax">step</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">InterTree::traverse</span><span class="plain-syntax">(</span><span class="identifier-syntax">step</span><span class="plain-syntax">-></span><span class="element-syntax">repository</span><span class="plain-syntax">, </span><a href="2-cpt.html#SP1" class="function-link"><span class="function-syntax">CodeGen::PackedText::visitor</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">text_consolidation_list_used</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">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"%d text literals:\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_consolidation_list_used</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">qsort</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_consolidation_list</span><span class="plain-syntax">, (</span><span class="identifier-syntax">size_t</span><span class="plain-syntax">) </span><span class="identifier-syntax">text_consolidation_list_used</span><span class="plain-syntax">, </span><span class="reserved-syntax">sizeof</span><span class="plain-syntax">(</span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *),</span>
|
||||
<span class="plain-syntax"> </span><a href="2-cpt.html#SP1" class="function-link"><span class="function-syntax">CodeGen::PackedText::compare_texts</span></a><span class="plain-syntax">);</span>
|
||||
|
||||
|
@ -105,7 +103,6 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">text_consolidation_list</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">];</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax"> = </span><a href="2-cpt.html#SP1" class="function-link"><span class="function-syntax">CodeGen::PackedText::unpack</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::cmp</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">current</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">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"%d: %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">j</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">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">ALPHA</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">ALPHA</span><span class="plain-syntax">, </span><span class="string-syntax">"alphabetised_text_%d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">j</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">ID</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Inter::Warehouse::create_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">InterTree::warehouse</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">),</span>
|
||||
|
@ -137,8 +134,6 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_name</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">InterSymbolsTables::symbol_from_frame_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">DEFN_CONST_IFLD</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter::Symbols::unannotate</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEXT_LITERAL_IANN</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"P%d = %d\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">j</span><span class="plain-syntax">-1);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
||||
|
|
|
@ -120,7 +120,6 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">ID</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">DATA_CONST_IFLD</span><span class="plain-syntax">];</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax"> = </span><a href="3-cal.html#SP4" class="function-link"><span class="function-syntax">CodeGen::CL::literal_text_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Inode::ID_to_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">));</span>
|
||||
<span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"$3 has tli\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">con_name</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="3-cg.html#SP6" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="3-cal.html#SP4" class="function-link"><span class="function-syntax">CodeGen::CL::constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="3-cg.html#SP6" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
|
||||
|
|
|
@ -337,16 +337,15 @@ so on. Those absolute basics are made here.
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::advance_stage_to</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INTER3_CSEQ</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Generating inter (3)"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> -1, </span><span class="identifier-syntax">debugging</span><span class="plain-syntax">, </span><span class="identifier-syntax">sequence_timer</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="1-htc.html#SP4" 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><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">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">Strings::compile_responses</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="1-htc.html#SP4" 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">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><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>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">TextSubstitutions::allow_no_further_text_subs</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">Deferrals::allow_no_further_deferrals</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#SP4" class="function-link"><span class="function-syntax">Sequence::allow_no_further_function_resources</span></a><span class="plain-syntax">)</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="1-htc.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_12" class="paragraph-anchor"></a><b>§2.12. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Generate inter, part 4</span><span class="named-paragraph-number">2.12</span></span><span class="comment-syntax"> =</span>
|
||||
|
@ -366,7 +365,7 @@ so on. Those absolute basics are made here.
|
|||
<span class="plain-syntax"> </span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::advance_stage_to</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INTER5_CSEQ</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Generating inter (5)"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> -1, </span><span class="identifier-syntax">debugging</span><span class="plain-syntax">, </span><span class="identifier-syntax">sequence_timer</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTMeasurements::compile_test_functions</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#SP4" 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><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">RTKinds::compile_heap_allocator</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">RTKinds::compile_structures</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">Rules::check_response_usages</span><span class="plain-syntax">)</span>
|
||||
|
@ -460,11 +459,26 @@ other's bodies. But I think the term "coroutine" is reasonable just the same.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">iterations</span><span class="plain-syntax">, (</span><span class="identifier-syntax">iterations</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">)?</span><span class="string-syntax">""</span><span class="plain-syntax">:</span><span class="string-syntax">"s"</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>And very similarly:
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>The template layer calls the following when that midnight hour chimes:
|
||||
</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">Sequence::compile_literal_resources</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">Sequence::compile_literal_resources</span></span>:<br/><a href="1-htc.html#SP2_11">§2.11</a>, <a href="1-htc.html#SP2_13">§2.13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_further_function_resources</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sequence::allow_no_further_function_resources</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">Sequence::allow_no_further_function_resources</span></span>:<br/><a href="1-htc.html#SP2_11">§2.11</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">no_further_function_resources</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Sequence::function_resources_allowed</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">no_further_function_resources</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>And very similarly:
|
||||
</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">Sequence::compile_literal_resources</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">Sequence::compile_literal_resources</span></span>:<br/><a href="1-htc.html#SP2_11">§2.11</a>, <a href="1-htc.html#SP2_13">§2.13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="identifier-syntax">iterations</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">repeat</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="identifier-syntax">iterations</span><span class="plain-syntax">++;</span>
|
||||
|
|
|
@ -220,7 +220,7 @@ so that you can never see partial results.
|
|||
</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">CompileConditions::begin</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">CompileConditions::begin</span></span>:<br/>Deciding to Defer - <a href="4-dtd.html#SP5">§5</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">CompileConditions::begin</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">CompileConditions::begin</span></span>:<br/>Deciding to Defer - <a href="4-dtd.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_session_number</span><span class="plain-syntax">++;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">OR_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
|
@ -231,7 +231,7 @@ multiple sessions happening at once:
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileConditions::add_calling</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">CompileConditions::add_calling</span></span>:<br/>Deciding to Defer - <a href="4-dtd.html#SP9_1">§9.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileConditions::add_calling</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">CompileConditions::add_calling</span></span>:<br/>Deciding to Defer - <a href="4-dtd.html#SP8_1">§8.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">current_session_number</span><span class="plain-syntax"> < </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no PM session"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">callings_in_condition_sp</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax"> == </span><span class="constant-syntax">MAX_CALLINGS_IN_MATCH</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">BelievedImpossible</span><span class="plain-syntax">),</span>
|
||||
|
@ -250,7 +250,7 @@ but in that event the use of <span class="extract"><span class="extract-syntax">
|
|||
</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">CompileConditions::end</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">CompileConditions::end</span></span>:<br/>Deciding to Defer - <a href="4-dtd.html#SP5">§5</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">CompileConditions::end</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">CompileConditions::end</span></span>:<br/>Deciding to Defer - <a href="4-dtd.html#SP4">§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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">current_session_number</span><span class="plain-syntax"> < </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"unstarted PM session"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">NC</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">x</span><span class="plain-syntax"> = </span><span class="identifier-syntax">callings_in_condition_sp</span><span class="plain-syntax">, </span><span class="identifier-syntax">downs</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</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">x</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">callings_session_number</span><span class="plain-syntax">[</span><span class="identifier-syntax">x</span><span class="plain-syntax">-1] == </span><span class="identifier-syntax">current_session_number</span><span class="plain-syntax">)) {</span>
|
||||
|
|
|
@ -112,7 +112,7 @@ a number: all that matters is that the correct integer value is compiled.
|
|||
|
||||
<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">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_int</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">N</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="2-cr.html#SP1">§1</a>.</li></ul>
|
||||
|
@ -125,7 +125,7 @@ a number: all that matters is that the correct integer value is compiled.
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_constant_instance</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTInstances::emitted_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</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">N</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">"no iname for instance"</span><span class="plain-syntax">);</span>
|
||||
|
@ -171,7 +171,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::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_of_constant</span><span class="plain-syntax">) == </span><span class="identifier-syntax">CON_description</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP14" class="function-link"><span class="function-syntax">Deferrals::compile_multiple_use_proposition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP13" class="function-link"><span class="function-syntax">Deferrals::compile_multiple_use_proposition</span></a><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">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Kinds::unary_construction_material</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_of_constant</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>
|
||||
|
@ -192,11 +192,11 @@ kinds of value:
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_of_constant</span><span 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">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">self_object_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::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">SELF_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><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">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">nothing_object_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::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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="constant-syntax">0</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_instance</span><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
|
||||
|
@ -227,7 +227,7 @@ kinds of value:
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_of_constant</span><span class="plain-syntax">) == </span><span class="identifier-syntax">CON_rulebook</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_rulebook</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">rb</span><span class="plain-syntax">-></span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
@ -244,12 +244,12 @@ kinds of value:
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_of_constant</span><span class="plain-syntax">) == </span><span class="identifier-syntax">CON_table_column</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">table_column</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_table_column</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">RTTables::column_id</span><span class="plain-syntax">(</span><span class="identifier-syntax">tc</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">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">Strings::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><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><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>
|
||||
|
@ -258,7 +258,7 @@ kinds of value:
|
|||
<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/UNDERSTANDING"</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">RTParsing::compile_understanding</span><span class="plain-syntax">(&</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
|
@ -266,7 +266,7 @@ kinds of value:
|
|||
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">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_use_option</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">use_option</span><span class="plain-syntax"> *</span><span class="identifier-syntax">uo</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_use_option</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">uo</span><span class="plain-syntax">-></span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
@ -278,7 +278,7 @@ kinds of value:
|
|||
<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_response</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_rule</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">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">value</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">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Strings::response_constant_iname</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="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Responses::response_constant_iname</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="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">Emit::holster_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">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="constant-syntax">0</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">c</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
|
||||
|
@ -321,7 +321,7 @@ contexts by using a tilde: <span class="extract"><span class="extract-syntax">~a
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">prn_to_eval</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EitherOrProperties::get_negation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn_to_eval</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">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">parity</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Emit::holster_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">RTProperties::iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn_to_eval</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
|
@ -333,7 +333,7 @@ contexts by using a tilde: <span class="extract"><span class="extract-syntax">~a
|
|||
<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">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">RTProperties::iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
|
|
@ -176,7 +176,7 @@ line 3 must not.
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileValues::to_code_val</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">CompileValues::to_code_val</span></span>:<br/>Compile Rvalues - <a href="2-cr.html#SP1_3">§1.3</a><br/>Compile Lvalues - <a href="2-cl.html#SP1_3">§1.3</a>, <a href="2-cl.html#SP1_3_2">§1.3.2</a>, <a href="2-cl.html#SP1_4">§1.4</a>, <a href="2-cl.html#SP2">§2</a><br/>Compile Conditions - <a href="2-cc.html#SP1">§1</a>, <a href="2-cc.html#SP1_1">§1.1</a>, <a href="2-cc.html#SP1_2">§1.2</a><br/>Compile Loops - <a href="4-cl.html#SP1_2">§1.2</a>, <a href="4-cl.html#SP2">§2</a>, <a href="4-cl.html#SP4">§4</a><br/>Deciding to Defer - <a href="4-dtd.html#SP5_2">§5.2</a>, <a href="4-dtd.html#SP16">§16</a>, <a href="4-dtd.html#SP18">§18</a>, <a href="4-dtd.html#SP19">§19</a>, <a href="4-dtd.html#SP21">§21</a>, <a href="4-dtd.html#SP22">§22</a>, <a href="4-dtd.html#SP23">§23</a><br/>Cinders and Deferrals - <a href="4-cad.html#SP4">§4</a><br/>Compile Invocations As Calls - <a href="5-ciac.html#SP3">§3</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP11">§11</a><br/>Compile Solutions to Equations - <a href="5-cste.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileValues::to_code_val</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">CompileValues::to_code_val</span></span>:<br/>Compile Rvalues - <a href="2-cr.html#SP1_3">§1.3</a><br/>Compile Lvalues - <a href="2-cl.html#SP1_3">§1.3</a>, <a href="2-cl.html#SP1_3_2">§1.3.2</a>, <a href="2-cl.html#SP1_4">§1.4</a>, <a href="2-cl.html#SP2">§2</a><br/>Compile Conditions - <a href="2-cc.html#SP1">§1</a>, <a href="2-cc.html#SP1_1">§1.1</a>, <a href="2-cc.html#SP1_2">§1.2</a><br/>Compile Loops - <a href="4-cl.html#SP1_2">§1.2</a>, <a href="4-cl.html#SP2">§2</a>, <a href="4-cl.html#SP4">§4</a><br/>Deciding to Defer - <a href="4-dtd.html#SP4_2">§4.2</a>, <a href="4-dtd.html#SP15">§15</a>, <a href="4-dtd.html#SP17">§17</a>, <a href="4-dtd.html#SP18">§18</a>, <a href="4-dtd.html#SP20">§20</a>, <a href="4-dtd.html#SP21">§21</a>, <a href="4-dtd.html#SP22">§22</a><br/>Cinders and Deferrals - <a href="4-cad.html#SP4">§4</a><br/>Compile Invocations As Calls - <a href="5-ciac.html#SP3">§3</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP11">§11</a><br/>Compile Solutions to Equations - <a href="5-cste.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="2-cv.html#SP5" class="function-link"><span class="function-syntax">CompileValues::to_code_val_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="constant-syntax">COMPILE_SPEC_AS_VALUE</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">CompileValues::to_code_val_of_kind</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">CompileValues::to_code_val_of_kind</span></span>:<br/>Compile Schemas - <a href="4-cs.html#SP3_2">§3.2</a>, <a href="4-cs.html#SP5_2">§5.2</a><br/>Compile Blocks and Lines - <a href="5-cbal.html#SP4_3_5_2">§4.3.5.2</a>, <a href="5-cbal.html#SP4_3_5_5">§4.3.5.5</a>, <a href="5-cbal.html#SP4_3_5_1_2">§4.3.5.1.2</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP6_1_1_3">§6.1.1.3</a>, <a href="5-cii.html#SP6_1_1_4_9">§6.1.1.4.9</a>, <a href="5-cii.html#SP6_1_1_4_10">§6.1.1.4.10</a>, <a href="5-cii.html#SP6_5_8">§6.5.8</a>, <a href="5-cii.html#SP6_5_8_1">§6.5.8.1</a>, <a href="5-cii.html#SP6_5_8_2">§6.5.8.2</a>, <a href="5-cii.html#SP6_5_8_3">§6.5.8.3</a><br/>Compile Arithmetic - <a href="5-ca.html#SP1_3_1">§1.3.1</a>, <a href="5-ca.html#SP1_3_2">§1.3.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">value</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>
|
||||
|
|
|
@ -171,7 +171,7 @@ variables, plus a single other value.
|
|||
</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">LocalParking::callings</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">LocalParking::callings</span></span>:<br/>Deciding to Defer - <a href="4-dtd.html#SP8">§8</a>, <a href="4-dtd.html#SP9">§9</a><br/>Compile Deferred Propositions - <a href="4-cdp.html#SP3_6_1_4_5">§3.6.1.4.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">LocalParking::callings</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">LocalParking::callings</span></span>:<br/>Deciding to Defer - <a href="4-dtd.html#SP7">§7</a>, <a href="4-dtd.html#SP8">§8</a><br/>Compile Deferred Propositions - <a href="4-cdp.html#SP3_6_1_4_5">§3.6.1.4.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="3-lp.html#SP4" class="function-link"><span class="function-syntax">LocalParking::array</span></a><span class="plain-syntax">(27);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
|
|
|
@ -87,7 +87,7 @@ symbol referring to the variable.
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::declare</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::declare</span></span>:<br/><a href="3-lv.html#SP4">§4</a>, <a href="3-lv.html#SP7">§7</a>, <a href="3-lv.html#SP9">§9</a><br/>Compile Lvalues - <a href="2-cl.html#SP1_1">§1.1</a>, <a href="2-cl.html#SP2">§2</a><br/>Compile Conditions - <a href="2-cc.html#SP1_3">§1.3</a>, <a href="2-cc.html#SP5_1">§5.1</a><br/>Local Variable Slates - <a href="3-lvs.html#SP17">§17</a>, <a href="3-lvs.html#SP19">§19</a><br/>Local Parking - <a href="3-lp.html#SP2">§2</a>, <a href="3-lp.html#SP3">§3</a><br/>Compile Schemas - <a href="4-cs.html#SP5_1">§5.1</a>, <a href="4-cs.html#SP5_2">§5.2</a><br/>Compile Loops - <a href="4-cl.html#SP1_1">§1.1</a>, <a href="4-cl.html#SP2">§2</a>, <a href="4-cl.html#SP4">§4</a><br/>Deciding to Defer - <a href="4-dtd.html#SP9_1">§9.1</a><br/>Compile Deferred Propositions - <a href="4-cdp.html#SP3_5_1">§3.5.1</a><br/>Compile Blocks and Lines - <a href="5-cbal.html#SP4_3_5_2">§4.3.5.2</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP3_2">§3.2</a>, <a href="5-cii.html#SP6_5_1">§6.5.1</a>, <a href="5-cii.html#SP6_5_3">§6.5.3</a><br/>Compile Solutions to Equations - <a href="5-cste.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::declare</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::declare</span></span>:<br/><a href="3-lv.html#SP4">§4</a>, <a href="3-lv.html#SP7">§7</a>, <a href="3-lv.html#SP9">§9</a><br/>Compile Lvalues - <a href="2-cl.html#SP1_1">§1.1</a>, <a href="2-cl.html#SP2">§2</a><br/>Compile Conditions - <a href="2-cc.html#SP1_3">§1.3</a>, <a href="2-cc.html#SP5_1">§5.1</a><br/>Local Variable Slates - <a href="3-lvs.html#SP17">§17</a>, <a href="3-lvs.html#SP19">§19</a><br/>Local Parking - <a href="3-lp.html#SP2">§2</a>, <a href="3-lp.html#SP3">§3</a><br/>Compile Schemas - <a href="4-cs.html#SP5_1">§5.1</a>, <a href="4-cs.html#SP5_2">§5.2</a><br/>Compile Loops - <a href="4-cl.html#SP1_1">§1.1</a>, <a href="4-cl.html#SP2">§2</a>, <a href="4-cl.html#SP4">§4</a><br/>Deciding to Defer - <a href="4-dtd.html#SP8_1">§8.1</a><br/>Compile Deferred Propositions - <a href="4-cdp.html#SP3_5_1">§3.5.1</a><br/>Compile Blocks and Lines - <a href="5-cbal.html#SP4_3_5_2">§4.3.5.2</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP3_2">§3.2</a>, <a href="5-cii.html#SP6_5_1">§6.5.1</a>, <a href="5-cii.html#SP6_5_3">§6.5.3</a><br/>Compile Solutions to Equations - <a href="5-cste.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-lvs.html#SP18" class="function-link"><span class="function-syntax">LocalVariableSlates::declare_one</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
|
@ -485,7 +485,7 @@ the name "the owner". Here <span class="extract"><span class="extract-syntax">W<
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">PM_CalledWithDash_wording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING_INIT</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::ensure_calling</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::ensure_calling</span></span>:<br/><a href="3-lv.html#SP22">§22</a><br/>Deciding to Defer - <a href="4-dtd.html#SP9_1">§9.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">LocalVariables::ensure_calling</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">LocalVariables::ensure_calling</span></span>:<br/><a href="3-lv.html#SP22">§22</a><br/>Deciding to Defer - <a href="4-dtd.html#SP8_1">§8.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="3-sf.html#SP2" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><span class="plain-syntax">()) && (</span><span class="function-syntax"><new-calling></span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">))) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="function-syntax"><<rp>></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">K</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">)) </span><a href="3-lv.html#SP25" class="function-link"><span class="function-syntax">LocalVariables::set_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
|
|
|
@ -499,7 +499,7 @@ following, without having to worry about how any of this works:
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::emit_new_local_value</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Frames::emit_new_local_value</span></span>:<br/>Compile Values - <a href="2-cv.html#SP6_1">§6.1</a><br/>Deciding to Defer - <a href="4-dtd.html#SP12">§12</a>, <a href="4-dtd.html#SP18">§18</a><br/>Compile Invocations As Calls - <a href="5-ciac.html#SP2_2">§2.2</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP3_2">§3.2</a>, <a href="5-cii.html#SP6_2_1">§6.2.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::emit_new_local_value</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Frames::emit_new_local_value</span></span>:<br/>Compile Values - <a href="2-cv.html#SP6_1">§6.1</a><br/>Deciding to Defer - <a href="4-dtd.html#SP11">§11</a>, <a href="4-dtd.html#SP17">§17</a><br/>Compile Invocations As Calls - <a href="5-ciac.html#SP2_2">§2.2</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP3_2">§3.2</a>, <a href="5-cii.html#SP6_2_1">§6.2.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">local_block_value</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bv</span><span class="plain-syntax"> = </span><a href="3-sf.html#SP16" class="function-link"><span class="function-syntax">Frames::allocate_local_block_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cs.html#SP1" class="function-link"><span class="function-syntax">CompileSchemas::from_terms_in_val_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bv</span><span class="plain-syntax">-></span><span class="element-syntax">to_refer</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
|
|
@ -140,7 +140,7 @@ A term with <span class="extract"><span class="extract-syntax">cinder</span></sp
|
|||
</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">Cinders::count</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">Cinders::count</span></span>:<br/>Compile Loops - <a href="4-cl.html#SP2">§2</a><br/>Deciding to Defer - <a href="4-dtd.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Cinders::count</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">Cinders::count</span></span>:<br/>Compile Loops - <a href="4-cl.html#SP2">§2</a><br/>Deciding to Defer - <a href="4-dtd.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">TRAVERSE_VARIABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">atom</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TRAVERSE_PROPOSITION</span><span class="plain-syntax">(</span><span class="identifier-syntax">atom</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop</span><span class="plain-syntax">)</span>
|
||||
|
@ -162,7 +162,7 @@ sets the kinds of the cinder values in the deferred function.
|
|||
</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">Cinders::compile_cindered_values</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">Cinders::compile_cindered_values</span></span>:<br/>Compile Loops - <a href="4-cl.html#SP2">§2</a><br/>Deciding to Defer - <a href="4-dtd.html#SP5_2">§5.2</a>, <a href="4-dtd.html#SP11">§11</a>, <a href="4-dtd.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Cinders::compile_cindered_values</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">Cinders::compile_cindered_values</span></span>:<br/>Compile Loops - <a href="4-cl.html#SP2">§2</a><br/>Deciding to Defer - <a href="4-dtd.html#SP4_2">§4.2</a>, <a href="4-dtd.html#SP10">§10</a>, <a href="4-dtd.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">save_current_pdef</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_pdef</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">current_pdef</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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>
|
||||
|
|
|
@ -162,7 +162,7 @@ that authors value safety over the slight speed overhead incurred.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val_var_s</span><span class="plain-syntax"> = </span><a href="3-lv.html#SP1" class="function-link"><span class="function-syntax">LocalVariables::declare</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v1</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">aux_var_s</span><span class="plain-syntax"> = </span><a href="3-lv.html#SP1" class="function-link"><span class="function-syntax">LocalVariables::declare</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP17" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP16" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">domain_prop</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SentencePropositions::from_spec</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">CreationPredicates::contains_callings</span><span class="plain-syntax">(</span><span class="identifier-syntax">domain_prop</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-cl.html#SP1_1_1" class="named-paragraph-link"><span class="named-paragraph">Issue called in repeat problem</span><span class="named-paragraph-number">1.1.1</span></a></span><span class="plain-syntax">;</span>
|
||||
|
@ -280,7 +280,7 @@ we can more efficiently defer for this single purpose if it is.
|
|||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileLoops::iterate</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">CompileLoops::iterate</span></span>:<br/><a href="4-cl.html#SP1_1">§1.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">spec</span><span class="plain-syntax">, </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fromv</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP17" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP16" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">INDIRECT2_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><a href="2-cv.html#SP5" class="function-link"><span class="function-syntax">CompileValues::to_code_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
|
@ -294,7 +294,7 @@ we can more efficiently defer for this single purpose if it is.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</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">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SentencePropositions::from_spec</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">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP4" class="function-link"><span class="function-syntax">Deferrals::defer_loop_domain</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP3" class="function-link"><span class="function-syntax">Deferrals::defer_loop_domain</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</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">arity</span><span class="plain-syntax"> = </span><a href="4-cad.html#SP3" class="function-link"><span class="function-syntax">Cinders::count</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">) + </span><span class="constant-syntax">1</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">arity</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">: </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">INDIRECT0_BIP</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
|
|
|
@ -97,13 +97,13 @@ is the item being taken.
|
|||
</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">CompilePropositions::to_test_as_condition</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">CompilePropositions::to_test_as_condition</span></span>:<br/><a href="4-cp.html#SP3">§3</a><br/>Compile Conditions - <a href="2-cc.html#SP1">§1</a><br/>Compile Loops - <a href="4-cl.html#SP1_2">§1.2</a><br/>Deciding to Defer - <a href="4-dtd.html#SP23">§23</a><br/>Compile Blocks and Lines - <a href="5-cbal.html#SP4_3_5_1_1">§4.3.5.1.1</a><br/>Compile Invocations - <a href="5-ci.html#SP1_3_1_2_1_1_1">§1.3.1.2.1.1.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">v</span><span class="plain-syntax">, </span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompilePropositions::to_test_as_condition</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">CompilePropositions::to_test_as_condition</span></span>:<br/><a href="4-cp.html#SP3">§3</a><br/>Compile Conditions - <a href="2-cc.html#SP1">§1</a><br/>Compile Loops - <a href="4-cl.html#SP1_2">§1.2</a><br/>Deciding to Defer - <a href="4-dtd.html#SP22">§22</a><br/>Compile Blocks and Lines - <a href="5-cbal.html#SP4_3_5_1_1">§4.3.5.1.1</a><br/>Compile Invocations - <a href="5-ci.html#SP1_3_1_2_1_1_1">§1.3.1.2.1.1.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">v</span><span class="plain-syntax">, </span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</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">PREDICATE_CALCULUS_WORKINGS</span><span class="plain-syntax">, </span><span class="string-syntax">"Compiling as test: $D\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">prop</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Propositions::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="comment-syntax"> the empty proposition is always true</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::val_true</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><a href="4-dtd.html#SP5" class="function-link"><span class="function-syntax">Deferrals::defer_test_of_proposition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP4" class="function-link"><span class="function-syntax">Deferrals::defer_test_of_proposition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop</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">v</span><span class="plain-syntax">) </span><span class="identifier-syntax">Binding::substitute_var_0_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">v</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TRAVERSE_VARIABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">atom</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_atom</span><span class="plain-syntax"> = </span><span class="identifier-syntax">prop</span><span class="plain-syntax">, *</span><span class="identifier-syntax">last_atom</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
|
@ -209,7 +209,7 @@ decision when asserting propositions about the initial state of the model.)
|
|||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompilePropositions::to_make_true</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">CompilePropositions::to_make_true</span></span>:<br/><a href="4-cp.html#SP5">§5</a><br/>Compile Blocks and Lines - <a href="5-cbal.html#SP4_3_2">§4.3.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</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">PREDICATE_CALCULUS_WORKINGS</span><span class="plain-syntax">, </span><span class="string-syntax">"Compiling as 'now': $D\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-cp.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Vet the proposition to be forced</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP11" class="function-link"><span class="function-syntax">Deferrals::defer_now_proposition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP10" class="function-link"><span class="function-syntax">Deferrals::defer_now_proposition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</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="identifier-syntax">parity</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">TRAVERSE_VARIABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">atom</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TRAVERSE_PROPOSITION</span><span class="plain-syntax">(</span><span class="identifier-syntax">atom</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
||||
|
@ -315,7 +315,7 @@ longer possible to know at compile-time.
|
|||
<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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP16" class="function-link"><span class="function-syntax">Deferrals::defer_number_of_matches</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">desc</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><a href="4-dtd.html#SP15" class="function-link"><span class="function-syntax">Deferrals::defer_number_of_matches</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no way to compile this without deferral"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
|
@ -329,7 +329,7 @@ longer possible to know at compile-time.
|
|||
<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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP18" class="function-link"><span class="function-syntax">Deferrals::defer_list_of_matches</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP17" class="function-link"><span class="function-syntax">Deferrals::defer_list_of_matches</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no way to compile this without deferral"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
|
@ -346,22 +346,22 @@ longer possible to know at compile-time.
|
|||
<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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP19" class="function-link"><span class="function-syntax">Deferrals::defer_random_match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">desc</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><a href="4-dtd.html#SP18" class="function-link"><span class="function-syntax">Deferrals::defer_random_match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no way to compile this without deferral"</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">CompilePropositions::to_total_of_matches</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">CompilePropositions::to_total_of_matches</span></span>:<br/>Compile Invocations Inline - <a href="5-cii.html#SP6_7">§6.7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP21" class="function-link"><span class="function-syntax">Deferrals::defer_total_of_matches</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</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><a href="4-dtd.html#SP20" class="function-link"><span class="function-syntax">Deferrals::defer_total_of_matches</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no way to compile this without deferral"</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">CompilePropositions::to_extremal_match</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">CompilePropositions::to_extremal_match</span></span>:<br/>Compile Invocations Inline - <a href="5-cii.html#SP6_7">§6.7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">sign</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP22" class="function-link"><span class="function-syntax">Deferrals::defer_extremal_match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="identifier-syntax">prn</span><span class="plain-syntax">, </span><span class="identifier-syntax">sign</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><a href="4-dtd.html#SP21" class="function-link"><span class="function-syntax">Deferrals::defer_extremal_match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="identifier-syntax">prn</span><span class="plain-syntax">, </span><span class="identifier-syntax">sign</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no way to compile this without deferral"</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">CompilePropositions::to_test_if_matches</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">CompilePropositions::to_test_if_matches</span></span>:<br/>Compile Invocations Inline - <a href="5-cii.html#SP6_5_5">§6.5.5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP23" class="function-link"><span class="function-syntax">Deferrals::defer_if_matches</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</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><a href="4-dtd.html#SP22" class="function-link"><span class="function-syntax">Deferrals::defer_if_matches</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no way to compile this without deferral"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
|
@ -373,7 +373,7 @@ and can indeed throw problems.
|
|||
</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">CompilePropositions::verify_descriptive</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">CompilePropositions::verify_descriptive</span></span>:<br/>Deciding to Defer - <a href="4-dtd.html#SP16">§16</a>, <a href="4-dtd.html#SP18">§18</a>, <a href="4-dtd.html#SP19">§19</a>, <a href="4-dtd.html#SP21">§21</a>, <a href="4-dtd.html#SP22">§22</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">billing</span><span class="plain-syntax">,</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompilePropositions::verify_descriptive</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">CompilePropositions::verify_descriptive</span></span>:<br/>Deciding to Defer - <a href="4-dtd.html#SP15">§15</a>, <a href="4-dtd.html#SP17">§17</a>, <a href="4-dtd.html#SP18">§18</a>, <a href="4-dtd.html#SP20">§20</a>, <a href="4-dtd.html#SP21">§21</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">billing</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">constructor</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">constructor</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">"description with null constructor"</span><span class="plain-syntax">);</span>
|
||||
|
||||
|
|
|
@ -203,18 +203,18 @@ Here <span class="extract"><span class="extract-syntax">this</span></span> is th
|
|||
<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="identifier-syntax">t</span><span class="plain-syntax">-></span><span class="identifier-syntax">constant_number</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">N</span><span class="plain-syntax"> < </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> >= </span><span class="constant-syntax">2</span><span class="plain-syntax">)) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"schemas are currently limited to *1 and *2"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">this</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ems</span><span class="plain-syntax">-></span><span class="element-syntax">ops_termwise</span><span class="plain-syntax">[</span><span class="identifier-syntax">N</span><span class="plain-syntax">], *</span><span class="identifier-syntax">other</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ems</span><span class="plain-syntax">-></span><span class="element-syntax">ops_termwise</span><span class="plain-syntax">[1-</span><span class="identifier-syntax">N</span><span class="plain-syntax">];</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><span class="identifier-syntax">adopted_rule_for_compilation</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">M</span><span class="plain-syntax"> = </span><span class="identifier-syntax">adopted_marker_for_compilation</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rule_to_which_this_is_a_response</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">M</span><span class="plain-syntax"> = </span><span class="identifier-syntax">response_marker_within_that_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">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">adopted_rule_for_compilation</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">adopted_marker_for_compilation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Strings::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">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="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>
|
||||
<span class="plain-syntax"> </span><a href="4-cs.html#SP4" class="function-link"><span class="function-syntax">CompileSchemas::compile_term_of_token</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">this</span><span class="plain-syntax">, </span><span class="identifier-syntax">m</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">by_reference</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">adopted_rule_for_compilation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">R</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">adopted_marker_for_compilation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">M</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">R</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">M</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-cs.html#SP3">§3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3_2" class="paragraph-anchor"></a><b>§3.2. </b>This is for <span class="extract"><span class="extract-syntax">*&</span></span>, which can only be used on the second term (i.e., term 1).
|
||||
|
|
|
@ -86,7 +86,7 @@ MathJax = {
|
|||
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">imperative</a></li><li><a href="index.html#4">Chapter 4: Propositions</a></li><li><b>Deciding to Defer</b></li></ul></div>
|
||||
<p class="purpose">To decide whether a proposition can be compiled immediately, in the body of the current function, or whether it must be deferred to a function of its own, which is merely called from the current function.</p>
|
||||
|
||||
<ul class="toc"><li><a href="4-dtd.html#SP1">§1. Reasons for deferral</a></li><li><a href="4-dtd.html#SP2">§2. The guillotine</a></li><li><a href="4-dtd.html#SP3">§3. Deferral requests</a></li><li><a href="4-dtd.html#SP5">§5. Testing, or deferring a test</a></li><li><a href="4-dtd.html#SP11">§11. Forcing with now, or deferring the force</a></li><li><a href="4-dtd.html#SP12">§12. Other uses</a></li><li><a href="4-dtd.html#SP13">§13. Multipurpose descriptions</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="4-dtd.html#SP1">§1. Reasons for deferral</a></li><li><a href="4-dtd.html#SP2">§2. Deferral requests</a></li><li><a href="4-dtd.html#SP4">§4. Testing, or deferring a test</a></li><li><a href="4-dtd.html#SP10">§10. Forcing with now, or deferring the force</a></li><li><a href="4-dtd.html#SP11">§11. Other uses</a></li><li><a href="4-dtd.html#SP12">§12. Multipurpose descriptions</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Reasons for deferral. </b>There are a number of possible reasons to defer a proposition, depending on
|
||||
how it is to be used; we may even want to convert a proposition to a
|
||||
|
@ -117,32 +117,23 @@ at runtime.
|
|||
<span class="plain-syntax">} </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure pcalc_prop_deferral is accessed in 4/cl, 4/cad, 4/cdp and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. The guillotine. </b>We must be careful not to request a fresh deferral after the point at which
|
||||
all deferral requests are redeemed — they would then never be reached.
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. Deferral requests. </b>The following fills out the paperwork to request a deferred proposition.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_further_deferrals</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::allow_no_further_deferrals</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">no_further_deferrals</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="SP3" class="paragraph-anchor"></a><b>§3. Deferral requests. </b>The following fills out the paperwork to request a deferred proposition.
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="function-syntax">Deferrals::new</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Deferrals::new</span></span>:<br/><a href="4-dtd.html#SP4">§4</a>, <a href="4-dtd.html#SP5">§5</a>, <a href="4-dtd.html#SP10">§10</a>, <a href="4-dtd.html#SP11">§11</a>, <a href="4-dtd.html#SP12">§12</a>, <a href="4-dtd.html#SP14">§14</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">reason</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="function-syntax">Deferrals::new</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Deferrals::new</span></span>:<br/><a href="4-dtd.html#SP3">§3</a>, <a href="4-dtd.html#SP4">§4</a>, <a href="4-dtd.html#SP9">§9</a>, <a href="4-dtd.html#SP10">§10</a>, <a href="4-dtd.html#SP11">§11</a>, <a href="4-dtd.html#SP13">§13</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">reason</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Sequence::function_resources_allowed</span><span class="plain-syntax">() == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"too late now to defer propositions"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="identifier-syntax">proposition_to_defer</span><span class="plain-syntax"> = </span><span class="identifier-syntax">prop</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="identifier-syntax">reason</span><span class="plain-syntax"> = </span><span class="identifier-syntax">reason</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="identifier-syntax">deferred_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="identifier-syntax">rtp_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">pdef</span><span class="plain-syntax">-></span><span class="identifier-syntax">ppd_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Enclosures::new_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">PROPOSITIONS_HAP</span><span class="plain-syntax">, </span><span class="identifier-syntax">PROPOSITION_HL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">no_further_deferrals</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Too late now to defer propositions"</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">pdef</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>We cache deferral requests in the case of loop domains, because they are typically
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>We cache deferral requests in the case of loop domains, because they are typically
|
||||
needed in the case of repeat-through loops where the same proposition is used three
|
||||
times in a row.
|
||||
</p>
|
||||
|
@ -154,13 +145,13 @@ times in a row.
|
|||
<span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="function-syntax">Deferrals::defer_loop_domain</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">Deferrals::defer_loop_domain</span></span>:<br/>Compile Loops - <a href="4-cl.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> == </span><span class="identifier-syntax">cache_loop_proposition</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">cache_loop_pdef</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP3" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">LOOP_DOMAIN_DEFER</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP2" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">LOOP_DOMAIN_DEFER</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">cache_loop_proposition</span><span class="plain-syntax"> = </span><span class="identifier-syntax">prop</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">cache_loop_pdef</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pdef</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. Testing, or deferring a test. </b>This is the first of several functions serving <a href="4-cp.html" class="internal">Compile Propositions</a>. In
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Testing, or deferring a test. </b>This is the first of several functions serving <a href="4-cp.html" class="internal">Compile Propositions</a>. In
|
||||
each case we decide whether or not to defer: if so we return <span class="extract"><span class="extract-syntax">TRUE</span></span> and compile
|
||||
the necessary code to call the deferred function; and if not return <span class="extract"><span class="extract-syntax">FALSE</span></span> and
|
||||
do nothing. (If we issue a problem message, we should then return <span class="extract"><span class="extract-syntax">TRUE</span></span>.)
|
||||
|
@ -177,17 +168,17 @@ evaluate the condition we just need to call it.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="2-cc.html#SP3" class="function-link"><span class="function-syntax">CompileConditions::begin</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">go_up</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-dtd.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">If the proposition is a negation, take care of that now</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">NC</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP7" class="function-link"><span class="function-syntax">Deferrals::count_callings_in_condition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-dtd.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">If the proposition is a negation, take care of that now</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">NC</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP6" class="function-link"><span class="function-syntax">Deferrals::count_callings_in_condition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">NC</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">AND_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP3" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">CONDITION_DEFER</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-dtd.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">Compile the call to the deferred function</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">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP2" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">CONDITION_DEFER</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-dtd.html#SP4_2" class="named-paragraph-link"><span class="named-paragraph">Compile the call to the deferred function</span><span class="named-paragraph-number">4.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">NC</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP8" class="function-link"><span class="function-syntax">Deferrals::prepare_to_retrieve_callings_in_test_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP9" class="function-link"><span class="function-syntax">Deferrals::retrieve_callings_in_test_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">NC</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP7" class="function-link"><span class="function-syntax">Deferrals::prepare_to_retrieve_callings_in_test_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP8" class="function-link"><span class="function-syntax">Deferrals::retrieve_callings_in_test_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">NC</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">NC</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">go_up</span><span class="plain-syntax">) </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
|
@ -197,11 +188,11 @@ evaluate the condition we just need to call it.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>§5.1. </b>This is done purely for the sake of compiling tidier code: if \(\phi = \lnot(\psi)\)
|
||||
<p class="commentary firstcommentary"><a id="SP4_1" class="paragraph-anchor"></a><b>§4.1. </b>This is done purely for the sake of compiling tidier code: if \(\phi = \lnot(\psi)\)
|
||||
then we defer \(\psi\) instead, negating the result of testing it.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">If the proposition is a negation, take care of that now</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">If the proposition is a negation, take care of that now</span><span class="named-paragraph-number">4.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -212,8 +203,8 @@ then we defer \(\psi\) instead, negating the result of testing it.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">go_up</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-dtd.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5_2" class="paragraph-anchor"></a><b>§5.2. </b>The first practical problem with deferrals is that the proposition is now
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-dtd.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4_2" class="paragraph-anchor"></a><b>§4.2. </b>The first practical problem with deferrals is that the proposition is now
|
||||
being tested in a different function, with its own stack frame, and that means
|
||||
that it has no access to the local variables we can see here. Moreover, it
|
||||
may not even be able to evaluate the term which the proposition is being
|
||||
|
@ -236,7 +227,7 @@ the local variable <span class="extract"><span class="extract-syntax">x</span></
|
|||
in the <span class="extract"><span class="extract-syntax">x</span></span> argument neatly effects a substitution of \(x = t\).
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the call to the deferred function</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 call to the deferred function</span><span class="named-paragraph-number">4.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -246,8 +237,8 @@ in the <span class="extract"><span class="extract-syntax">x</span></span> argume
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">substitution</span><span class="plain-syntax">) </span><a href="2-cv.html#SP5" class="function-link"><span class="function-syntax">CompileValues::to_code_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">substitution</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-dtd.html#SP5">§5</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>The second practical problem concerns callings. If we compile:
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-dtd.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>The second practical problem concerns callings. If we compile:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -282,11 +273,11 @@ certain that <span class="extract"><span class="extract-syntax">f</span></span>
|
|||
setting of <span class="extract"><span class="extract-syntax">t_2</span></span> and <span class="extract"><span class="extract-syntax">t_3</span></span>.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>Here we find out what size of deferred list we will need:
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>Here we find out what size of deferred list we will need:
|
||||
</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">Deferrals::count_callings_in_condition</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">Deferrals::count_callings_in_condition</span></span>:<br/><a href="4-dtd.html#SP5">§5</a>, <a href="4-dtd.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::count_callings_in_condition</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">Deferrals::count_callings_in_condition</span></span>:<br/><a href="4-dtd.html#SP4">§4</a>, <a href="4-dtd.html#SP8">§8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</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">calling_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TRAVERSE_VARIABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">atom</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TRAVERSE_PROPOSITION</span><span class="plain-syntax">(</span><span class="identifier-syntax">atom</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop</span><span class="plain-syntax">)</span>
|
||||
|
@ -295,7 +286,7 @@ setting of <span class="extract"><span class="extract-syntax">t_2</span></span>
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">calling_count</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>In both cases (a test, or something other), we will compile an expression
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>In both cases (a test, or something other), we will compile an expression
|
||||
whose side-effects of evaluation will set the necessary calling locals. But
|
||||
the details differ. Here <span class="extract"><span class="extract-syntax">f</span></span> is a test; <span class="extract"><span class="extract-syntax">g</span></span> is some other function returning
|
||||
a value.
|
||||
|
@ -314,11 +305,11 @@ case which isn't <span class="extract"><span class="extract-syntax">as_test</spa
|
|||
</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">Deferrals::prepare_to_retrieve_callings_in_test_context</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">Deferrals::prepare_to_retrieve_callings_in_test_context</span></span>:<br/><a href="4-dtd.html#SP5">§5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP8" class="function-link"><span class="function-syntax">Deferrals::prepare_to_retrieve_callings</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::prepare_to_retrieve_callings_in_test_context</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">Deferrals::prepare_to_retrieve_callings_in_test_context</span></span>:<br/><a href="4-dtd.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP7" class="function-link"><span class="function-syntax">Deferrals::prepare_to_retrieve_callings</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</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">void</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::prepare_to_retrieve_callings_in_other_context</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">Deferrals::prepare_to_retrieve_callings_in_other_context</span></span>:<br/><a href="4-dtd.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP8" class="function-link"><span class="function-syntax">Deferrals::prepare_to_retrieve_callings</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::prepare_to_retrieve_callings_in_other_context</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">Deferrals::prepare_to_retrieve_callings_in_other_context</span></span>:<br/><a href="4-dtd.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP7" class="function-link"><span class="function-syntax">Deferrals::prepare_to_retrieve_callings</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::prepare_to_retrieve_callings</span><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_test</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">stash</span><span class="plain-syntax"> = </span><a href="3-lp.html#SP5" class="function-link"><span class="function-syntax">LocalParking::callings</span></a><span class="plain-syntax">();</span>
|
||||
|
@ -340,16 +331,16 @@ case which isn't <span class="extract"><span class="extract-syntax">as_test</spa
|
|||
<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>Second, call one of the following functions:
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. </b>Second, call one of the following 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">Deferrals::retrieve_callings_in_test_context</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">Deferrals::retrieve_callings_in_test_context</span></span>:<br/><a href="4-dtd.html#SP5">§5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">NC</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">NC</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><a href="4-dtd.html#SP9" class="function-link"><span class="function-syntax">Deferrals::retrieve_callings_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">NC</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::retrieve_callings_in_test_context</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">Deferrals::retrieve_callings_in_test_context</span></span>:<br/><a href="4-dtd.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">NC</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">NC</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><a href="4-dtd.html#SP8" class="function-link"><span class="function-syntax">Deferrals::retrieve_callings_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">NC</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">void</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::retrieve_callings_in_other_context</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">Deferrals::retrieve_callings_in_other_context</span></span>:<br/><a href="4-dtd.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">NC</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP7" class="function-link"><span class="function-syntax">Deferrals::count_callings_in_condition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">NC</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><a href="4-dtd.html#SP9" class="function-link"><span class="function-syntax">Deferrals::retrieve_callings_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">NC</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::retrieve_callings_in_other_context</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">Deferrals::retrieve_callings_in_other_context</span></span>:<br/><a href="4-dtd.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">NC</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP6" class="function-link"><span class="function-syntax">Deferrals::count_callings_in_condition</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">NC</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><a href="4-dtd.html#SP8" class="function-link"><span class="function-syntax">Deferrals::retrieve_callings_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">NC</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::retrieve_callings_inner</span><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">NC</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_test</span><span class="plain-syntax">) {</span>
|
||||
|
@ -363,7 +354,7 @@ case which isn't <span class="extract"><span class="extract-syntax">as_test</spa
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">TRAVERSE_VARIABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">atom</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TRAVERSE_PROPOSITION</span><span class="plain-syntax">(</span><span class="identifier-syntax">atom</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">CreationPredicates::is_calling_up_atom</span><span class="plain-syntax">(</span><span class="identifier-syntax">atom</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-dtd.html#SP9_1" class="named-paragraph-link"><span class="named-paragraph">Retrieve this calling</span><span class="named-paragraph-number">9.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-dtd.html#SP8_1" class="named-paragraph-link"><span class="named-paragraph">Retrieve this calling</span><span class="named-paragraph-number">8.1</span></a></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><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">(); </span><span class="identifier-syntax">downs</span><span class="plain-syntax">--; }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">as_test</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::val_true</span><span class="plain-syntax">();</span>
|
||||
|
@ -379,7 +370,7 @@ case which isn't <span class="extract"><span class="extract-syntax">as_test</spa
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP9_1" class="paragraph-anchor"></a><b>§9.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Retrieve this calling</span><span class="named-paragraph-number">9.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP8_1" class="paragraph-anchor"></a><b>§8.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Retrieve this calling</span><span class="named-paragraph-number">8.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -404,8 +395,8 @@ case which isn't <span class="extract"><span class="extract-syntax">as_test</spa
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">as_test</span><span class="plain-syntax">) </span><a href="2-cc.html#SP4" class="function-link"><span class="function-syntax">CompileConditions::add_calling</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">local</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-dtd.html#SP9">§9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>The following function can be used when:
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-dtd.html#SP8">§8</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>The following function can be used when:
|
||||
</p>
|
||||
|
||||
<ul class="items"><li>● we want to force deferral in all cases, regardless of the proposition, and
|
||||
|
@ -422,19 +413,19 @@ case which isn't <span class="extract"><span class="extract-syntax">as_test</spa
|
|||
<span class="plain-syntax"> </span><span class="string-syntax">"that it couldn't be used anywhere else."</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP3" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">CONDITION_DEFER</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP2" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">CONDITION_DEFER</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">pdef</span><span class="plain-syntax">-></span><span class="element-syntax">ppd_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. Forcing with now, or deferring the force. </b>Again, we defer this if and only if there is quantification. But everything
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. Forcing with now, or deferring the force. </b>Again, we defer this if and only if there is quantification. But everything
|
||||
is much easier here: we're in a void context, and we don't have callings.
|
||||
</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">Deferrals::defer_now_proposition</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">Deferrals::defer_now_proposition</span></span>:<br/>Compile Propositions - <a href="4-cp.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Propositions::contains_quantifier</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP3" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">NOW_ASSERTION_DEFER</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP2" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">NOW_ASSERTION_DEFER</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="element-syntax">ppd_iname</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cad.html#SP4" class="function-link"><span class="function-syntax">Cinders::compile_cindered_values</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">);</span>
|
||||
|
@ -444,7 +435,7 @@ is much easier here: we're in a void context, and we don't have callings.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. Other uses. </b>Unlike "now" and testing, the other ways to use propositions — for example,
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. Other uses. </b>Unlike "now" and testing, the other ways to use propositions — for example,
|
||||
counting matches with "the number of ..." — can take a description which
|
||||
might not be a constant. The following gives a general way to call a deferred
|
||||
function for one of those other purposes, allowing for callings.
|
||||
|
@ -455,11 +446,11 @@ the haven)". <span class="extract"><span class="extract-syntax">RandomCalling</s
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::call_deferred_fn</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">Deferrals::call_deferred_fn</span></span>:<br/><a href="4-dtd.html#SP16">§16</a>, <a href="4-dtd.html#SP18">§18</a>, <a href="4-dtd.html#SP19">§19</a>, <a href="4-dtd.html#SP21">§21</a>, <a href="4-dtd.html#SP22">§22</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">,</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::call_deferred_fn</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">Deferrals::call_deferred_fn</span></span>:<br/><a href="4-dtd.html#SP15">§15</a>, <a href="4-dtd.html#SP17">§17</a>, <a href="4-dtd.html#SP18">§18</a>, <a href="4-dtd.html#SP20">§20</a>, <a href="4-dtd.html#SP21">§21</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</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">reason</span><span class="plain-syntax">, </span><span class="identifier-syntax">general_pointer</span><span class="plain-syntax"> </span><span class="identifier-syntax">data</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">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP3" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">reason</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP2" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">reason</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="identifier-syntax">defn_ref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">data</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP8" class="function-link"><span class="function-syntax">Deferrals::prepare_to_retrieve_callings_in_other_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP7" class="function-link"><span class="function-syntax">Deferrals::prepare_to_retrieve_callings_in_other_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</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">arity</span><span class="plain-syntax"> = </span><a href="4-cad.html#SP3" class="function-link"><span class="function-syntax">Cinders::count</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) </span><span class="identifier-syntax">arity</span><span class="plain-syntax"> = </span><span class="identifier-syntax">arity</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">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">arity</span><span class="plain-syntax">) {</span>
|
||||
|
@ -478,10 +469,10 @@ the haven)". <span class="extract"><span class="extract-syntax">RandomCalling</s
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">RTKinds::emit_strong_id_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::unary_construction_material</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP9" class="function-link"><span class="function-syntax">Deferrals::retrieve_callings_in_other_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP8" class="function-link"><span class="function-syntax">Deferrals::retrieve_callings_in_other_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. Multipurpose descriptions. </b>Descriptions in the form \(\phi(x)\), where \(x\) is free, are also sometimes
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. Multipurpose descriptions. </b>Descriptions in the form \(\phi(x)\), where \(x\) is free, are also sometimes
|
||||
converted into values — this is the kind of value "description". The
|
||||
Inter representation is (the address of) a function <span class="extract"><span class="extract-syntax">D</span></span> which, in general,
|
||||
performs task \(u\) on value \(v\) when called as <span class="extract"><span class="extract-syntax">D(u, v)</span></span>, where \(u\) is
|
||||
|
@ -502,7 +493,7 @@ states, times of day, and so on).
|
|||
<span class="definition-keyword">define</span> <span class="constant-syntax">EXTREMAL_DUSAGE</span><span class="plain-syntax"> -6 </span><span class="comment-syntax"> return the maximal property value among such </span>\(w\)
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">LIST_OF_DUSAGE</span><span class="plain-syntax"> -7 </span><span class="comment-syntax"> return the list of </span>\(w\)<span class="comment-syntax"> such that </span>\(\phi(w)\)
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. </b>Multi-purpose description routines are pretty dandy, then, but they have
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. </b>Multi-purpose description routines are pretty dandy, then, but they have
|
||||
one big drawback: they can't be passed cinders, because they might be called
|
||||
from absolutely anywhere. (And, once again, we are trying to avoid having to
|
||||
capture local values as closures.) Hence the following:
|
||||
|
@ -552,12 +543,12 @@ capture local values as closures.) Hence the following:
|
|||
<span class="plain-syntax"> </span><span class="string-syntax">"time and another place."</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP3" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">MULTIPURPOSE_DEFER</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><a href="4-dtd.html#SP2" class="function-link"><span class="function-syntax">Deferrals::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">MULTIPURPOSE_DEFER</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="element-syntax">ppd_iname</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. </b>Because multipurpose descriptions have this big drawback, we want to avoid them
|
||||
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. </b>Because multipurpose descriptions have this big drawback, we want to avoid them
|
||||
if we possibly can. Fortunately something much simpler will often do. For example,
|
||||
consider:
|
||||
</p>
|
||||
|
@ -581,12 +572,12 @@ to perform the calculation. We never need a multi-purpose description routine fo
|
|||
\(\phi(x)\) because it only occurs in this one context.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>§16. </b>We now perform this trick for "number of":
|
||||
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. </b>We now perform this trick for "number of":
|
||||
</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">Deferrals::defer_number_of_matches</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Deferrals::defer_number_of_matches</span></span>:<br/>Compile Propositions - <a href="4-cp.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP17" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP16" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">INDIRECT1_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><a href="2-cv.html#SP5" class="function-link"><span class="function-syntax">CompileValues::to_code_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
|
@ -596,28 +587,28 @@ to perform the calculation. We never need a multi-purpose description routine fo
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SentencePropositions::from_spec</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cp.html#SP7" class="function-link"><span class="function-syntax">CompilePropositions::verify_descriptive</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"a number of things matching a description"</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP12" class="function-link"><span class="function-syntax">Deferrals::call_deferred_fn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMBER_OF_DEFER</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL_GENERAL_POINTER</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-dtd.html#SP11" class="function-link"><span class="function-syntax">Deferrals::call_deferred_fn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">NUMBER_OF_DEFER</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL_GENERAL_POINTER</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>§17. </b>By "variable", we actually mean any stored value:
|
||||
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>§16. </b>By "variable", we actually mean any stored value:
|
||||
</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">Deferrals::spec_is_variable_of_kind_description</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></span>:<br/><a href="4-dtd.html#SP16">§16</a>, <a href="4-dtd.html#SP18">§18</a>, <a href="4-dtd.html#SP19">§19</a>, <a href="4-dtd.html#SP21">§21</a>, <a href="4-dtd.html#SP22">§22</a>, <a href="4-dtd.html#SP23">§23</a><br/>Compile Loops - <a href="4-cl.html#SP1_1">§1.1</a>, <a href="4-cl.html#SP2">§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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></span>:<br/><a href="4-dtd.html#SP15">§15</a>, <a href="4-dtd.html#SP17">§17</a>, <a href="4-dtd.html#SP18">§18</a>, <a href="4-dtd.html#SP20">§20</a>, <a href="4-dtd.html#SP21">§21</a>, <a href="4-dtd.html#SP22">§22</a><br/>Compile Loops - <a href="4-cl.html#SP1_1">§1.1</a>, <a href="4-cl.html#SP2">§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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Lvalues::is_lvalue</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">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) == </span><span class="identifier-syntax">CON_description</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>§18. </b>And now for "list of":
|
||||
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>§17. </b>And now for "list of":
|
||||
</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">Deferrals::defer_list_of_matches</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Deferrals::defer_list_of_matches</span></span>:<br/>Compile Propositions - <a href="4-cp.html#SP6">§6</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><a href="4-dtd.html#SP17" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP16" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">LIST_OF_TY_DESC_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><a href="3-sf.html#SP21" class="function-link"><span class="function-syntax">Frames::emit_new_local_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
|
@ -628,17 +619,17 @@ to perform the calculation. We never need a multi-purpose description routine fo
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SentencePropositions::from_spec</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cp.html#SP7" class="function-link"><span class="function-syntax">CompilePropositions::verify_descriptive</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"a list of things matching a description"</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP12" class="function-link"><span class="function-syntax">Deferrals::call_deferred_fn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">LIST_OF_DEFER</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL_GENERAL_POINTER</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP11" class="function-link"><span class="function-syntax">Deferrals::call_deferred_fn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">LIST_OF_DEFER</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL_GENERAL_POINTER</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>§19. </b>And similarly for "a random ...":
|
||||
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>§18. </b>And similarly for "a random ...":
|
||||
</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">Deferrals::defer_random_match</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Deferrals::defer_random_match</span></span>:<br/>Compile Propositions - <a href="4-cp.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP17" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP16" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">INDIRECT1_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><a href="2-cv.html#SP5" class="function-link"><span class="function-syntax">CompileValues::to_code_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
|
@ -649,14 +640,14 @@ to perform the calculation. We never need a multi-purpose description routine fo
|
|||
<span class="plain-syntax"> </span><a href="4-cp.html#SP7" class="function-link"><span class="function-syntax">CompilePropositions::verify_descriptive</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"a random thing matching a description"</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Propositions::describes_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">K</span><span class="plain-syntax">) && (</span><a href="4-dtd.html#SP20" class="function-link"><span class="function-syntax">Deferrals::has_finite_domain</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-dtd.html#SP19_1" class="named-paragraph-link"><span class="named-paragraph">Issue random impossible problem</span><span class="named-paragraph-number">19.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP12" class="function-link"><span class="function-syntax">Deferrals::call_deferred_fn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">RANDOM_OF_DEFER</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL_GENERAL_POINTER</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">K</span><span class="plain-syntax">) && (</span><a href="4-dtd.html#SP19" class="function-link"><span class="function-syntax">Deferrals::has_finite_domain</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-dtd.html#SP18_1" class="named-paragraph-link"><span class="named-paragraph">Issue random impossible problem</span><span class="named-paragraph-number">18.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP11" class="function-link"><span class="function-syntax">Deferrals::call_deferred_fn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">RANDOM_OF_DEFER</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL_GENERAL_POINTER</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP19_1" class="paragraph-anchor"></a><b>§19.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue random impossible problem</span><span class="named-paragraph-number">19.1</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP18_1" class="paragraph-anchor"></a><b>§18.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue random impossible problem</span><span class="named-paragraph-number">18.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -668,15 +659,15 @@ to perform the calculation. We never need a multi-purpose description routine fo
|
|||
<span class="plain-syntax"> </span><span class="string-syntax">"random text'."</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-dtd.html#SP19">§19</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>§20. </b>Some kinds are such that all legal values can efficiently be looped through
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-dtd.html#SP18">§18</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>§19. </b>Some kinds are such that all legal values can efficiently be looped through
|
||||
at run-time, some are not: we can sensibly loop over all scenes, but not
|
||||
over all texts. We use the term "domain" to mean the set of values which
|
||||
a loop traverses.
|
||||
</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">Deferrals::has_finite_domain</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">Deferrals::has_finite_domain</span></span>:<br/><a href="4-dtd.html#SP19">§19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::has_finite_domain</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">Deferrals::has_finite_domain</span></span>:<br/><a href="4-dtd.html#SP18">§18</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="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">Kinds::Behaviour::is_an_enumeration</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
|
@ -684,13 +675,13 @@ a loop traverses.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>§21. </b>And similarly for "total of":
|
||||
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>§20. </b>And similarly for "total of":
|
||||
</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">Deferrals::defer_total_of_matches</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Deferrals::defer_total_of_matches</span></span>:<br/>Compile Propositions - <a href="4-cp.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prn</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">"total of on non-property"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP17" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP16" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">SEQUENTIAL_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
|
||||
|
@ -709,13 +700,13 @@ a loop traverses.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SentencePropositions::from_spec</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cp.html#SP7" class="function-link"><span class="function-syntax">CompilePropositions::verify_descriptive</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"a total property value for things matching a description"</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP12" class="function-link"><span class="function-syntax">Deferrals::call_deferred_fn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">TOTAL_DEFER</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP11" class="function-link"><span class="function-syntax">Deferrals::call_deferred_fn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">TOTAL_DEFER</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_property</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>§22. </b>And the extremal case is pretty well the same, too, with only some fuss over
|
||||
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>§21. </b>And the extremal case is pretty well the same, too, with only some fuss over
|
||||
identifying which superlative is meant. We get here from code like "let X be
|
||||
the heaviest thing in the wooden box" where there has previously been a
|
||||
definition of "heavy".
|
||||
|
@ -725,7 +716,7 @@ definition of "heavy".
|
|||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Deferrals::defer_extremal_match</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">Deferrals::defer_extremal_match</span></span>:<br/>Compile Propositions - <a href="4-cp.html#SP6">§6</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">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">sign</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prn</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">"extremal of on non-property"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP17" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP16" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">SEQUENTIAL_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
|
||||
|
@ -755,20 +746,20 @@ definition of "heavy".
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SentencePropositions::from_spec</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cp.html#SP7" class="function-link"><span class="function-syntax">CompilePropositions::verify_descriptive</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"an extreme case of something matching a description"</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP12" class="function-link"><span class="function-syntax">Deferrals::call_deferred_fn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">EXTREMAL_DEFER</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="4-dtd.html#SP11" class="function-link"><span class="function-syntax">Deferrals::call_deferred_fn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="constant-syntax">EXTREMAL_DEFER</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_measurement_definition</span><span class="plain-syntax">(</span><span class="identifier-syntax">mdef_found</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="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP23" class="paragraph-anchor"></a><b>§23. </b>Finally, the occasionally useful task of seeing if the current value of
|
||||
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>§22. </b>Finally, the occasionally useful task of seeing if the current value of
|
||||
the "substitution variable") is within the domain.
|
||||
</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">Deferrals::defer_if_matches</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">Deferrals::defer_if_matches</span></span>:<br/>Compile Propositions - <a href="4-cp.html#SP6">§6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</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="4-dtd.html#SP17" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-dtd.html#SP16" class="function-link"><span class="function-syntax">Deferrals::spec_is_variable_of_kind_description</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">INDIRECT2_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><a href="2-cv.html#SP5" class="function-link"><span class="function-syntax">CompileValues::to_code_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec</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">Strings::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><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><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>
|
||||
|
|
|
@ -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#SP11_1">§11.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_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="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#SP11">§11</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#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="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>
|
||||
|
@ -162,7 +162,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#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#SP11">§11</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#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="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>
|
||||
|
@ -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#SP11">§11</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#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="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#SP11">§11</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">§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="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#SP11">§11</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">§7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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>
|
||||
|
||||
|
@ -122,7 +122,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">Inter::Bookmarks::package</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">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">Emit::current_enclosure</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">Emit::current_enclosure</span></span>:<br/>Enclosures - <a href="4-enc.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP7">§7</a>, <a href="4-ts.html#SP7_1">§7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="function-syntax">Emit::current_enclosure</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">Emit::current_enclosure</span></span>:<br/>Enclosures - <a href="4-enc.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.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><span class="identifier-syntax">Packaging::enclosure</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,8 +140,8 @@ 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#SP7">§7</a>, <a href="4-ts.html#SP7_1">§7.1</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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="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="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>
|
||||
<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">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -98,7 +98,7 @@ is the "launcher" routine for a response:
|
|||
</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">Strings::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">Strings::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="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>
|
||||
</pre>
|
||||
|
@ -107,7 +107,7 @@ its name in the output code:
|
|||
</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">Strings::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">Strings::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="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>
|
||||
|
@ -139,13 +139,13 @@ but also (in most cases) a <span class="extract"><span class="extract-syntax">TX
|
|||
</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">Strings::response_cue</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Strings::response_cue</span></span>:<br/><a href="4-rsp.html#SP11_1_1">§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">phsf</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">via_I6</span><span class="plain-syntax">) {</span>
|
||||
<span class="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="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">phsf</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#SP4" 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">phsf</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><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">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">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">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>
|
||||
|
@ -153,8 +153,8 @@ but also (in most cases) a <span class="extract"><span class="extract-syntax">TX
|
|||
<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::data_acceptable</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">Strings::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">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="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">;</span>
|
||||
|
@ -167,7 +167,7 @@ enormous.
|
|||
</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">Strings::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">Strings::compile_response_launchers</span></span>:<br/>Text Substitutions - <a href="4-ts.html#SP10">§10</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">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="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>
|
||||
|
@ -192,7 +192,7 @@ a call to an activity based on that value:
|
|||
|
||||
<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>
|
||||
|
||||
<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">Strings::response_constant_iname</span></a><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">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>
|
||||
|
@ -391,11 +391,11 @@ track of the content of each response.
|
|||
</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">Strings::compile_responses</span><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">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#SP12" class="function-link"><span class="function-syntax">TextSubstitutions::compile_text_routines_in_response_mode</span></a><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="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
|
||||
|
@ -416,13 +416,12 @@ text for the response than the one we first created.
|
|||
<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#SP4" 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="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><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="element-syntax">original_text</span><span class="plain-syntax">-></span><span class="element-syntax">dont_need_after_all</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">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_iname</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP6" class="function-link"><span class="function-syntax">TextSubstitutions::text_substitution_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">Strings::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_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">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>
|
||||
|
@ -442,7 +441,7 @@ 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">Strings::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">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><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>
|
||||
|
@ -545,7 +544,7 @@ divided up by the extensions containing the rules which produce them.
|
|||
<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">Strings::frame_for_response</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Strings::frame_for_response</span></span>:<br/>Text Substitutions - <a href="4-ts.html#SP11">§11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">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>
|
||||
|
@ -555,7 +554,7 @@ 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">Strings::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="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>
|
||||
|
@ -564,7 +563,7 @@ 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">Strings::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="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>
|
||||
|
@ -590,7 +589,7 @@ text to assert a change:
|
|||
<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">Strings::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="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>
|
||||
|
@ -614,16 +613,16 @@ 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">Strings::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="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::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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>
|
||||
|
@ -669,12 +668,12 @@ text needs to be printed in a particular way.
|
|||
<span class="plain-syntax"> </span><span class="string-syntax">"some text as a response, then it can only occur once in its rule."</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">downs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalParking::park</span><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">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">Strings::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">phsf</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</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>
|
||||
|
@ -693,7 +692,7 @@ text needs to be printed in a particular way.
|
|||
<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#SP7" 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><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>
|
||||
|
|
|
@ -112,7 +112,7 @@ it will always be a 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">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#SP4">§4</a><br/>Text Substitutions - <a href="4-ts.html#SP7_1">§7.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">content</span><span class="plain-syntax">) {</span>
|
||||
<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="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>
|
||||
|
@ -121,13 +121,12 @@ it will always be a function.
|
|||
<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. It's defined in <a href="../BasicInformKit/index.html" class="internal">BasicInformKit</a>, but is equivalent
|
||||
to calling <span class="extract"><span class="extract-syntax">TextLiterals::small_block(EMPTY_TEXT_PACKED_HL)</span></span>.
|
||||
<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/>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="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_VALUE_HL</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('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="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>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Suppressing apostrophe substitution. </b>We are allowed to flag one text where ordinary apostrophe-to-double-quote
|
||||
|
@ -164,7 +163,7 @@ much later in the process. See <a href="../codegen-module/2-cpt.html" class="int
|
|||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">TextLiterals::to_value_inner</span><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">unesc</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">w1</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wide::cmp</span><span class="plain-syntax">(</span><span class="identifier-syntax">Lexer::word_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">w1</span><span class="plain-syntax">), </span><span class="identifier-syntax">L</span><span class="string-syntax">"\"\""</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="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_VALUE_HL</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#SP2" class="function-link"><span class="function-syntax">TextLiterals::default_text</span></a><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">content_iname</span><span class="plain-syntax"> = </span><a href="4-enc.html#SP1" class="function-link"><span class="function-syntax">Enclosures::new_iname</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LITERALS_HAP</span><span class="plain-syntax">, </span><span class="constant-syntax">TEXT_LITERAL_HL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::annotate_i</span><span class="plain-syntax">(</span><span class="identifier-syntax">content_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEXT_LITERAL_IANN</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
|
||||
|
|
|
@ -72,148 +72,46 @@ 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>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>Text containing substitutions, such as "You pick up [the noun] thoughtfully.",
|
||||
are compiled as routines rather than Z-machine strings. Each is stored in one
|
||||
of the following structures. Unlike literal text, a text routine might lead
|
||||
to problem messages when eventually compiled, so it is useful to record the
|
||||
current sentence when a text routine is created: this means a problem can
|
||||
be reported at the right place.
|
||||
</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">
|
||||
|
||||
<p class="commentary">The easiest way to understand this section is to pretend that responses
|
||||
don't exist, and ignore them until they come up later.
|
||||
<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>
|
||||
|
||||
<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">text_substitution</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">unsubstituted_text</span><span class="plain-syntax">; </span><span class="comment-syntax"> including the substitutions in squares</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">dont_need_after_all</span><span class="plain-syntax">; </span><span class="comment-syntax"> in case replaced as a response</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tr_done_already</span><span class="plain-syntax">; </span><span class="comment-syntax"> has been compiled</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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">responding_to_marker</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sentence_using_this</span><span class="plain-syntax">; </span><span class="comment-syntax"> where this occurs in source</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owning_point</span><span class="plain-syntax">; </span><span class="comment-syntax"> shows which compilation unit this belongs to</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">local_names_existed_at_usage_time</span><span class="plain-syntax">; </span><span class="comment-syntax"> remember in case of problems</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parked_stack_frame</span><span class="plain-syntax">; </span><span class="comment-syntax"> for cases where possible</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> the I6 array for this</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts_routine_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> the routine to implement it</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ts_sb_needed</span><span class="plain-syntax">; </span><span class="comment-syntax"> reference copy of small block needed as a constant?</span>
|
||||
<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>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">let</span><span class="plain-syntax"> </span><span class="identifier-syntax">Q</span><span class="plain-syntax"> </span><span class="identifier-syntax">be</span><span class="plain-syntax"> </span><span class="string-syntax">"the [fox speed] brown fox"</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">"Where has that [sleeping animal] got to?"</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure text_substitution is accessed in 4/rsp and here.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>We are only allowed to create new ones until the following is set:
|
||||
<p class="commentary">These both look like text substitutions, but only <span class="extract"><span class="extract-syntax">the [fox speed] brown fox</span></span>
|
||||
actually is one: <span class="extract"><span class="extract-syntax">say</span></span> phrases are compiled directly, like so:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_further_text_subs</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">let</span><span class="plain-syntax"> </span><span class="identifier-syntax">Q</span><span class="plain-syntax"> </span><span class="identifier-syntax">be</span><span class="plain-syntax"> </span><span class="string-syntax">"the [fox speed] brown fox"</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">"Where has that "</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">say</span><span class="plain-syntax"> </span><span class="identifier-syntax">sleeping</span><span class="plain-syntax"> </span><span class="identifier-syntax">animal</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">" got to?"</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>The following global variable records whether we are currently compiling
|
||||
a text routine, rather than some other routine, or free-standing objects.
|
||||
<p class="commentary">So we are concerned only with substitutions used as values. At run-time, these
|
||||
are essentially the same as <a href="4-tl.html" class="internal">Text Literals</a>, but where the content field in
|
||||
the small block is a function pointer:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">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="plain-syntax"> small block:</span>
|
||||
<span class="plain-syntax"> Q ----------------> CONSTANT_PACKED_TEXT_STORAGE or CONSTANT_PERISHABLE_TEXT_STORAGE</span>
|
||||
<span class="plain-syntax"> function</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>Like literal texts, text substitutions aren't printed out in full when
|
||||
they first arise; we keep a note of them when we need them, and compile
|
||||
suitable routines later.
|
||||
<p class="commentary">It is worth emphasising that this is a function. In an interpreted language
|
||||
like Perl, an interpolation such as <span class="extract"><span class="extract-syntax">"Deleted $file_count files"</span></span> is immediately
|
||||
converted to text when it is executed; and even in some compiled languages
|
||||
like Swift, the same is essentially true — in that the text is compiled to
|
||||
code which immediately produces the expanded version.
|
||||
</p>
|
||||
|
||||
<p class="commentary">A problem with this is that a text substitution probably contains references
|
||||
to variables which exist now, but may not exist later when a routine to do
|
||||
the printing is being compiled. For example,
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
<p>say "The dial reads [counter].";</p>
|
||||
</blockquote>
|
||||
|
||||
<p class="commentary">may do quite different things at different points in the code, according to
|
||||
what <span class="extract"><span class="extract-syntax">counter</span></span> currently means. So we need to take note of the current
|
||||
stack frame; and we mustn't optimise by compiling identical text substitutions
|
||||
to the same routines to print them.
|
||||
</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('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">TextSubstitutions::new_text_substitution</span></span>:<br/><a href="4-ts.html#SP7">§7</a>, <a href="4-ts.html#SP7_1">§7.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="plain-syntax"> </span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">no_further_text_subs</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Panic, because it is really too late</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></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="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">local_names_existed_at_usage_time</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="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">parked_stack_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">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">parked_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">new_frame</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">) </span><span class="identifier-syntax">LocalVariableSlates::append</span><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">parked_stack_frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<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">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">responding_to_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">ts</span><span class="plain-syntax">-></span><span class="element-syntax">dont_need_after_all</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">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_sb_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Functions::defn_being_compiled</span><span class="plain-syntax">()) &&</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">LocalVariableSlates::size</span><span class="plain-syntax">(</span><span class="identifier-syntax">Frames::current_stack_frame</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">ts</span><span class="plain-syntax">-></span><span class="element-syntax">local_names_existed_at_usage_time</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">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_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_routine_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>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Functions::defn_being_compiled</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">idb</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">idb</span><span class="plain-syntax">-></span><span class="identifier-syntax">head_of_defn</span><span class="plain-syntax">-></span><span class="identifier-syntax">at</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">"Requesting text routine %d %08x %W %08x\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">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</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">ts</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1" class="paragraph-anchor"></a><b>§4.1. </b>Timing is going to turn out to be a real problem in all of this code.
|
||||
If Inform finds that it needs a text substitution very late in its run —
|
||||
after it has compiled them and can't compile any more — there's nothing
|
||||
to do but panic.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Panic, because it is really too late</span><span class="named-paragraph-number">4.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Too late for further text substitutions"</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ts.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>The template layer calls the following when that midnight hour chimes:
|
||||
</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::allow_no_further_text_subs</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">no_further_text_subs</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. </b>For some years these were compiled to routines verbosely called
|
||||
<span class="extract"><span class="extract-syntax">text_routine_1</span></span> and so on, but no longer:
|
||||
</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::text_substitution_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::text_substitution_iname</span></span>:<br/><a href="4-ts.html#SP7">§7</a>, <a href="4-ts.html#SP7_1">§7.1</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_sb_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="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_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>The following is called when we want to compile a usage of a text
|
||||
substitution; for instance, when compiling
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
<p>say "The time is [time of day]. Hurry!";</p>
|
||||
</blockquote>
|
||||
|
||||
<p class="commentary">we'll compile a call to a routine like <span class="extract"><span class="extract-syntax">TS_1()</span></span>, and make a note to compile
|
||||
that routine later. This appearance of the routine name is called the "cue".
|
||||
</p>
|
||||
|
||||
<p class="commentary">In a value context, though, things may differ if we are dealing with a text
|
||||
substitution referring to local variables. Consider for example:
|
||||
<p class="commentary">In Inform, however, a text substitution is instead compiled to a function which
|
||||
can at some later time perform that expansion. This means it is, in effect, a
|
||||
form of closure, and has to retain some memory of the environment in which it
|
||||
came up. Consider for example:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -226,133 +124,197 @@ substitution referring to local variables. Consider for example:
|
|||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">let</span><span class="plain-syntax"> </span><span class="identifier-syntax">the</span><span class="plain-syntax"> </span><span class="identifier-syntax">cage</span><span class="plain-syntax"> </span><span class="identifier-syntax">be</span><span class="plain-syntax"> </span><span class="identifier-syntax">a</span><span class="plain-syntax"> </span><span class="identifier-syntax">random</span><span class="plain-syntax"> </span><span class="identifier-syntax">container</span><span class="plain-syntax"> </span><span class="identifier-syntax">in</span><span class="plain-syntax"> </span><span class="identifier-syntax">the</span><span class="plain-syntax"> </span><span class="identifier-syntax">Discount</span><span class="plain-syntax"> </span><span class="identifier-syntax">Cage</span><span class="plain-syntax"> </span><span class="identifier-syntax">Warehouse</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">can</span><span class="plain-syntax">'</span><span class="identifier-syntax">t</span><span class="plain-syntax"> </span><span class="identifier-syntax">exit</span><span class="plain-syntax"> </span><span class="identifier-syntax">closed</span><span class="plain-syntax"> </span><span class="identifier-syntax">containers</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">"As bad as [a cage]."</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">decide</span><span class="plain-syntax"> </span><span class="identifier-syntax">on</span><span class="plain-syntax"> </span><span class="string-syntax">"As bad as [a cage]."</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<p class="commentary">The trouble is that the response text will be needed in stack frames other
|
||||
than this one, i.e., when the local variable <span class="extract"><span class="extract-syntax">cage</span></span> has long since
|
||||
disappeared. The value of <span class="extract"><span class="extract-syntax">cage</span></span> must be "captured", and we need the response
|
||||
text to be some kind of closure. In fact what we do is simpler — we expand
|
||||
the text and stored it as what it expands to now, not a method for expanding
|
||||
it later. (This avoids issues of garbage collection on the captured values.)
|
||||
<p class="commentary">The trouble is that <span class="extract"><span class="extract-syntax">decide on</span></span> causes a return out of the current stack frame;
|
||||
at which point the local variable <span class="extract"><span class="extract-syntax">cage</span></span> will cease to exist, and it will then
|
||||
not be possible to expand <span class="extract"><span class="extract-syntax">"As bad as [a cage]."</span></span>. If we were pursuing closures
|
||||
more seriously, we would have to capture <span class="extract"><span class="extract-syntax">cage</span></span>, and then worry about garbage
|
||||
collection.
|
||||
</p>
|
||||
|
||||
<p class="commentary">Instead we call a substitution like this "perishable", and in cases of doubt
|
||||
we expand this on the spot, i.e., inside the original stack frame.
|
||||
</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('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">adopted_rule_for_compilation</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Rules::log</span><span class="plain-syntax">(</span><span class="identifier-syntax">adopted_rule_for_compilation</span><span class="plain-syntax">);</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::compile_value</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">TextSubstitutions::compile_value</span></span>:<br/><a href="4-ts.html#SP6">§6</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">fn</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">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><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><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_PERISHABLE_TEXT_STORAGE_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><a href="2-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">fn</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>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. Cues. </b>The "cue" for a text substitution that is not a response is its original appearance:
|
||||
like so:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">let</span><span class="plain-syntax"> </span><span class="identifier-syntax">Q</span><span class="plain-syntax"> </span><span class="identifier-syntax">be</span><span class="plain-syntax"> </span><span class="string-syntax">"the [fox speed] brown fox"</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<p class="commentary">When compiling this value, the following is called with <span class="extract"><span class="extract-syntax">W</span></span> being the single-word
|
||||
wording <span class="extract"><span class="extract-syntax">"the [fox speed] brown fox"</span></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::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="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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">INTER_DATA_VHMODE:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP2_2" class="named-paragraph-link"><span class="named-paragraph">Cue in data context</span><span class="named-paragraph-number">2.2</span></a></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">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"cue in void context"</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">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">adopted_rule_for_compilation</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Write the actual cue</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>§2.1. </b>The function call to TEXT_TY_EXPANDIFPERISHABLE_HL is unnecessary in the
|
||||
case of a response to a rule, since those are never perishable.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Cue in value context</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="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="reserved-syntax">if</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="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ts.html#SP2_1_1" class="named-paragraph-link"><span class="named-paragraph">Make the TS</span><span class="named-paragraph-number">2.1.1</span></a></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">tin</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><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">tin</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">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">downs</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">captured</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">VH</span><span class="plain-syntax">-></span><span class="identifier-syntax">vhmode_wanted</span><span class="plain-syntax"> == </span><span class="identifier-syntax">INTER_VAL_VHMODE</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">downs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LocalParking::park</span><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Frames::boxed_frame</span><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><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">TEXT_TY_EXPANDIFPERISHABLE_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><span class="identifier-syntax">Frames::emit_new_local_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_text</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">captured</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP4" class="function-link"><span class="function-syntax">TextSubstitutions::new_text_substitution</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">adopted_rule_for_compilation</span><span class="plain-syntax">, </span><span class="identifier-syntax">adopted_marker_for_compilation</span><span class="plain-syntax">, </span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::current_enclosure</span></a><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">tin</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP6" class="function-link"><span class="function-syntax">TextSubstitutions::text_substitution_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="reserved-syntax">if</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="identifier-syntax">INTER_DATA_VHMODE</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">tin</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><a href="2-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">tin</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">captured</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><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>
|
||||
<span 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">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="identifier-syntax">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="named-paragraph-container code-font"><a href="4-ts.html#SP2_1_1" class="named-paragraph-link"><span class="named-paragraph">Make the TS</span><span class="named-paragraph-number">2.1.1</span></a></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">tin</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><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">TEXT_TY_EXPANDIFPERISHABLE_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><span class="identifier-syntax">Frames::emit_new_local_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_text</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><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">tin</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><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>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<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">Write the actual cue</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ts.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">Cue in data context</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">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP4" class="function-link"><span class="function-syntax">TextSubstitutions::new_text_substitution</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">adopted_rule_for_compilation</span><span class="plain-syntax">, </span><span class="identifier-syntax">adopted_marker_for_compilation</span><span class="plain-syntax">, </span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::current_enclosure</span></a><span class="plain-syntax">());</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">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">N</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><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">ts_routine_iname</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">N</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#SP2_1_1" class="named-paragraph-link"><span class="named-paragraph">Make the TS</span><span class="named-paragraph-number">2.1.1</span></a></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">tin</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><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">tin</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ts.html#SP2">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_1_1" class="paragraph-anchor"></a><b>§2.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make the TS</span><span class="named-paragraph-number">2.1.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">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="plain-syntax"> </span><span class="identifier-syntax">rule_to_which_this_is_a_response</span><span class="plain-syntax">, </span><span class="identifier-syntax">response_marker_within_that_rule</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-ts.html#SP2_1">§2.1</a> (twice), <a href="4-ts.html#SP2_2">§2.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. Substitutions. </b>Each substitution creates an object like so:
|
||||
</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">text_substitution</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">unsubstituted_text</span><span class="plain-syntax">; </span><span class="comment-syntax"> including the substitutions in squares</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tr_done_already</span><span class="plain-syntax">; </span><span class="comment-syntax"> has been compiled</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sentence_using_this</span><span class="plain-syntax">; </span><span class="comment-syntax"> where this occurs in source</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owning_point</span><span class="plain-syntax">; </span><span class="comment-syntax"> shows which compilation unit this belongs to</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">local_names_existed_at_usage_time</span><span class="plain-syntax">; </span><span class="comment-syntax"> remember in case of problems</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">responding_to_marker</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="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>
|
||||
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>Two inames are involved here:
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> small block:</span>
|
||||
<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="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>
|
||||
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">TextSubstitutions::function_iname</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="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>
|
||||
|
||||
<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="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>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Sequence::function_resources_allowed</span><span class="plain-syntax">() == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"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">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tin</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP6" class="function-link"><span class="function-syntax">TextSubstitutions::text_substitution_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="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tin</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">tin</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">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>
|
||||
<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>And the following clarifies problem messages arising from this point,
|
||||
since it often confuses newcomers:
|
||||
</p>
|
||||
<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">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">responding_to_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">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>
|
||||
|
||||
<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="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>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">local_names_existed_at_usage_time</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Functions::defn_being_compiled</span><span class="plain-syntax">()) &&</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">LocalVariableSlates::size</span><span class="plain-syntax">(</span><span class="identifier-syntax">Frames::current_stack_frame</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">ts</span><span class="plain-syntax">-></span><span class="element-syntax">local_names_existed_at_usage_time</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::is_it_worth_adding</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">it_is_not_worth_adding</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">TextSubstitutions::it_is_worth_adding</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">it_is_not_worth_adding</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::it_is_not_worth_adding</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">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><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::current_enclosure</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">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>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Functions::defn_being_compiled</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">idb</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">idb</span><span class="plain-syntax">-></span><span class="identifier-syntax">head_of_defn</span><span class="plain-syntax">-></span><span class="identifier-syntax">at</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">"Requesting text routine %d %08x %W %08x\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">frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</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">ts</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></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#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">void</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::append_text_substitution_proviso</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">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>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">current_ts_being_compiled</span><span class="plain-syntax">-></span><span class="element-syntax">local_names_existed_at_usage_time</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::log</span><span class="plain-syntax">(</span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">());</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(9, </span><span class="identifier-syntax">current_ts_being_compiled</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">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">" %PIt may be worth adding that this problem arose in text "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"which both contains substitutions and is also being used as "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"a value - being put into a variable, or used as one of the "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"ingredients in a phrase other than 'say'. Because that means "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"it needs to be used in places outside its immediate context, "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"it is not allowed to refer to any 'let' values or phrase "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"options - those are temporary things, long gone by the time it "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"would need to be printed."</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. </b>So much for the cues. As with text literals in the previous section, it's
|
||||
now time to redeem our promises and compile the <span class="extract"><span class="extract-syntax">TS_X</span></span> routines. These routines
|
||||
can't be produced all at once, and are sometimes not needed at all: the
|
||||
responses mechanism makes this quite fiddly, and so do the existence of
|
||||
other constructs in Inform which, when compiled, may make new text
|
||||
substitutions. So compilation is handled by a coroutine. (I'm a
|
||||
little old-fashioned in calling this a coroutine: it achieves its task in
|
||||
instalments, effectively sharing time with other routines which in turn
|
||||
add to its task, until everybody is done.)
|
||||
</p>
|
||||
|
||||
<p class="commentary">Basically, we compile as many text substitutions as we can out of those not
|
||||
yet done, returning the number we compile.
|
||||
</p>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Compilation. </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">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#SP10" 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">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="function-syntax">TextSubstitutions::compile_as_needed</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_as_needed</span></span>:<br/><a href="4-ts.html#SP12">§12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">in_response_mode</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-rsp.html#SP5" class="function-link"><span class="function-syntax">Strings::compile_response_launchers</span></a><span class="plain-syntax">();</span>
|
||||
<span class="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="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>
|
||||
|
@ -363,9 +325,11 @@ yet done, returning the number we compile.
|
|||
<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">ts</span><span class="plain-syntax">-></span><span class="element-syntax">dont_need_after_all</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</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="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><a href="4-ts.html#SP11" class="function-link"><span class="function-syntax">TextSubstitutions::compile_single_substitution</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">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="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>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
@ -373,59 +337,54 @@ yet done, returning the number we compile.
|
|||
<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="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>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::currently_compiling</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">compiling_text_routines_mode</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. </b>We can now forget about the coroutine management, and just compile a single
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>We can now forget about the coroutine management, and just compile a single
|
||||
text substitution. The main thing is to copy over references to local variables
|
||||
from the stack frame creating this text substitution to the stack frame
|
||||
compiling it.
|
||||
</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_single_substitution</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_single_substitution</span></span>:<br/><a href="4-ts.html#SP10">§10</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">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="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">parked_stack_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">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">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="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_routine_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">phsf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">parked_stack_frame</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">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">phsf</span><span class="plain-syntax"> = </span><a href="4-rsp.html#SP7" class="function-link"><span class="function-syntax">Strings::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="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">phsf</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">phsf</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">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">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#SP11_1" class="named-paragraph-link"><span class="named-paragraph">Compile a say-phrase</span><span class="named-paragraph-number">11.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_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="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">phsf</span><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="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="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_sb_needed</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">ts</span><span class="plain-syntax">-></span><span class="element-syntax">ts_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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><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_PERISHABLE_TEXT_STORAGE_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><a href="2-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">ts</span><span class="plain-syntax">-></span><span class="element-syntax">ts_routine_iname</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="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="SP11_1" class="paragraph-anchor"></a><b>§11.1. </b>Of course, if we used Inform's standard phrase mechanism exactly, then
|
||||
<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>
|
||||
|
||||
<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">11.1</span></span><span class="comment-syntax"> =</span>
|
||||
<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>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -464,20 +423,61 @@ 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#SP11">§11</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. </b>See the "Responses" section for why, but we sometimes want to force
|
||||
<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>
|
||||
|
||||
<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('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">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="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#SP10" 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><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>
|
||||
</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
|
||||
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>
|
||||
<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>
|
||||
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::is_it_worth_adding</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">it_is_not_worth_adding</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">TextSubstitutions::it_is_worth_adding</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">it_is_not_worth_adding</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::it_is_not_worth_adding</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">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>
|
||||
|
||||
<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="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>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">current_ts_being_compiled</span><span class="plain-syntax">-></span><span class="element-syntax">local_names_existed_at_usage_time</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Frames::log</span><span class="plain-syntax">(</span><span class="identifier-syntax">Frames::current_stack_frame</span><span class="plain-syntax">());</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(9, </span><span class="identifier-syntax">current_ts_being_compiled</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">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">" %PIt may be worth adding that this problem arose in text "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"which both contains substitutions and is also being used as "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"a value - being put into a variable, or used as one of the "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"ingredients in a phrase other than 'say'. Because that means "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"it needs to be used in places outside its immediate context, "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"it is not allowed to refer to any 'let' values or phrase "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"options - those are temporary things, long gone by the time it "</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"would need to be printed."</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-tl.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="progresscurrent">ts</li><li class="progresssection"><a href="4-rsp.html">rsp</a></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-rsp.html">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -361,16 +361,16 @@ change the strings of compiled code here without making a matching change in
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTProperties::compile_value</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">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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="constant-syntax">1</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">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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="constant-syntax">0</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTProperties::compile_default_value</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">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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="constant-syntax">0</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
|
@ -406,7 +406,7 @@ all to work; the following keep a flag to mark that.
|
|||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTProperties::compile_vp_default_value</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">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-prp.html#SP9" class="function-link"><span class="function-syntax">RTProperties::uses_non_typesafe_0</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">))</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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="constant-syntax">0</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
|
|
@ -79,8 +79,8 @@ function togglePopup(material_id) {
|
|||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">rule</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="comment-syntax"> rule whose phrase's definition is being compiled</span>
|
||||
<span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">adopted_rule_for_compilation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> when a new response is being compiled</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">adopted_marker_for_compilation</span><span class="plain-syntax"> = -1; </span><span class="comment-syntax"> when a new response is being compiled</span>
|
||||
<span class="identifier-syntax">rule</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">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> when a new response is being compiled</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">response_marker_within_that_rule</span><span class="plain-syntax"> = -1; </span><span class="comment-syntax"> when a new response is being compiled</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>In Inter code, a rule is compiled to the name of the routine implementing it.
|
||||
</p>
|
||||
|
@ -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/>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">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#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="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>
|
||||
|
||||
|
|
|
@ -241,7 +241,7 @@ chosen), but no problem message has been issued about this, or
|
|||
<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="5-rsfk.html#SP6" class="function-link"><span class="function-syntax">RTKinds::get_default_value</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">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">v1</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
|
|
@ -439,7 +439,7 @@ infrastructure, and we access it with a single call.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"actions plugin inactive"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_action_name</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">action_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">an</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ARvalues::to_action_name</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">Holsters::data_acceptable</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><a href="7-act.html#SP1" class="function-link"><span class="function-syntax">RTActions::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">an</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</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">N</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
|
|
@ -160,7 +160,6 @@ requirements.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_requirement</span><span class="plain-syntax"> *</span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">search_results</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">req</span><span class="plain-syntax">-></span><span class="element-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">genre</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">req</span><span class="plain-syntax">-></span><span class="element-syntax">work</span><span class="plain-syntax">-></span><span class="element-syntax">genre</span><span class="plain-syntax"> != </span><span class="identifier-syntax">pipeline_genre</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="4-pm.html#SP2" class="function-link"><span class="function-syntax">PipelineManager::path_within_nest</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
|
||||
<span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Looking in %p\n"</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">scan_directory</span><span class="plain-syntax"> *</span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Directories::open</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">D</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">LEAFNAME</span><span class="plain-syntax">)</span>
|
||||
|
|
|
@ -3171,7 +3171,7 @@ helpful about what exactly is wrong.
|
|||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">preceding</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">)) - </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">preceding</span><span class="plain-syntax"> >= </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">) &&</span>
|
||||
<span class="plain-syntax"> (((</span><span class="identifier-syntax">compiling_text_routines_mode</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">shape</span><span class="plain-syntax"> == </span><span class="constant-syntax">SAY_UTSHAPE</span><span class="plain-syntax">))) &&</span>
|
||||
<span class="plain-syntax"> (((</span><span class="identifier-syntax">TextSubstitutions::currently_compiling</span><span class="plain-syntax">()) || (</span><span class="identifier-syntax">shape</span><span class="plain-syntax"> == </span><span class="constant-syntax">SAY_UTSHAPE</span><span class="plain-syntax">))) &&</span>
|
||||
<span class="plain-syntax"> ((</span><span class="identifier-syntax">preceding</span><span class="plain-syntax"> == </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">)))</span>
|
||||
<span class="plain-syntax"> || (</span><span class="identifier-syntax">Lexer::word</span><span class="plain-syntax">(</span><span class="identifier-syntax">preceding</span><span class="plain-syntax">) == </span><span class="identifier-syntax">COMMA_V</span><span class="plain-syntax">)))</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-dsh.html#SP18_2_2" class="named-paragraph-link"><span class="named-paragraph">Unknown found text occurs as a text substitution</span><span class="named-paragraph-number">18.2.2</span></a></span>
|
||||
|
|
|
@ -86,7 +86,6 @@ void PipelineManager::search_nest_for(inbuild_genre *gen, inbuild_nest *N,
|
|||
inbuild_requirement *req, linked_list *search_results) {
|
||||
if ((req->work->genre) && (req->work->genre != pipeline_genre)) return;
|
||||
pathname *P = PipelineManager::path_within_nest(N);
|
||||
LOG("Looking in %p\n", P);
|
||||
scan_directory *D = Directories::open(P);
|
||||
if (D) {
|
||||
TEMPORARY_TEXT(LEAFNAME)
|
||||
|
|
|
@ -1,40 +1,40 @@
|
|||
Total memory consumption was 278014K = 271 MB
|
||||
Total memory consumption was 278685K = 272 MB
|
||||
|
||||
64.1% was used for 1343985 objects, in 309333 frames in 223 x 800K = 178400K = 174 MB:
|
||||
63.7% was used for 1358697 objects, in 311577 frames in 222 x 800K = 177600K = 173 MB:
|
||||
|
||||
9.3% inter_tree_node_array 37 x 8192 = 303104 objects, 26674336 bytes
|
||||
5.6% linked_list 28809 objects, 16133040 bytes
|
||||
5.3% text_stream_array 2680 x 100 = 268000 objects, 15093760 bytes
|
||||
5.6% linked_list 28812 objects, 16134720 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.1% inter_symbol_array 69 x 1024 = 70656 objects, 6219936 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
|
||||
1.1% map_data 670 objects, 3178480 bytes
|
||||
0.9% kind_array 65 x 1000 = 65000 objects, 2602080 bytes
|
||||
0.9% kind_array 66 x 1000 = 66000 objects, 2642112 bytes
|
||||
0.6% inter_schema_token 13459 objects, 1938096 bytes
|
||||
0.6% vocabulary_entry_array 161 x 100 = 16100 objects, 1808352 bytes
|
||||
0.4% match_trie_array 10 x 1000 = 10000 objects, 1360320 bytes
|
||||
0.4% i6_schema_array 21 x 100 = 2100 objects, 1260672 bytes
|
||||
0.3% inter_name_array 23 x 1000 = 23000 objects, 1104736 bytes
|
||||
0.3% id_body 940 objects, 1075360 bytes
|
||||
0.3% inter_name_array 22 x 1000 = 22000 objects, 1056704 bytes
|
||||
0.3% inter_package 14238 objects, 1025136 bytes
|
||||
0.3% inter_package 14670 objects, 1056240 bytes
|
||||
0.3% adjective_meaning 202 objects, 1000304 bytes
|
||||
0.3% excerpt_meaning 3098 objects, 966576 bytes
|
||||
0.3% inter_symbols_table 14238 objects, 911232 bytes
|
||||
0.3% inter_symbols_table 14670 objects, 938880 bytes
|
||||
0.3% production 3885 objects, 901320 bytes
|
||||
0.3% ptoken 8390 objects, 872560 bytes
|
||||
0.3% grammatical_usage 3610 objects, 866400 bytes
|
||||
0.3% individual_form 2560 objects, 860160 bytes
|
||||
0.2% dictionary 17371 objects, 833808 bytes
|
||||
0.2% dictionary 17805 objects, 854640 bytes
|
||||
0.2% inter_schema_node 8663 objects, 831648 bytes
|
||||
0.2% package_request 8971 objects, 789448 bytes
|
||||
0.2% dict_entry_array 233 x 100 = 23300 objects, 753056 bytes
|
||||
0.2% inter_name_generator_array 17 x 1000 = 17000 objects, 680544 bytes
|
||||
0.2% package_request 9403 objects, 827464 bytes
|
||||
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% scan_directory 94 objects, 388032 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
|
||||
|
@ -45,11 +45,11 @@ Total memory consumption was 278014K = 271 MB
|
|||
---- rule_family_data 400 objects, 147200 bytes
|
||||
---- index_lexicon_entry 395 objects, 142200 bytes
|
||||
---- nonterminal 759 objects, 139656 bytes
|
||||
---- nascent_array 1951 objects, 124864 bytes
|
||||
---- documentation_ref 1274 objects, 112112 bytes
|
||||
---- inference 1703 objects, 108992 bytes
|
||||
---- hierarchy_location 733 objects, 105552 bytes
|
||||
---- imperative_defn 1376 objects, 99072 bytes
|
||||
---- nascent_array 1519 objects, 97216 bytes
|
||||
---- anl_entry_array 2 x 1000 = 2000 objects, 96064 bytes
|
||||
---- noun_usage 2401 objects, 96040 bytes
|
||||
---- preposition 273 objects, 87360 bytes
|
||||
|
@ -63,8 +63,8 @@ Total memory consumption was 278014K = 271 MB
|
|||
---- spatial_data 670 objects, 64320 bytes
|
||||
---- kind_macro_definition 9 objects, 62280 bytes
|
||||
---- booking 860 objects, 61920 bytes
|
||||
---- actions_rcd_data 1880 objects, 60160 bytes
|
||||
---- scenes_rcd_data 1880 objects, 60160 bytes
|
||||
---- actions_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
|
||||
|
@ -109,7 +109,7 @@ Total memory consumption was 278014K = 271 MB
|
|||
---- booking_list 407 objects, 13024 bytes
|
||||
---- adjective_iname_holder 320 objects, 12800 bytes
|
||||
---- pathname 292 objects, 11680 bytes
|
||||
---- stopwatch_timer 141 objects, 11280 bytes
|
||||
---- stopwatch_timer 140 objects, 11200 bytes
|
||||
---- filename 208 objects, 8320 bytes
|
||||
---- equation_node 68 objects, 7616 bytes
|
||||
---- understanding_item_array 3 x 100 = 300 objects, 7296 bytes
|
||||
|
@ -236,23 +236,23 @@ Total memory consumption was 278014K = 271 MB
|
|||
---- kind_template_definition 1 object, 40 bytes
|
||||
---- by_routine_bp_data 1 object, 40 bytes
|
||||
|
||||
35.8% was used for memory not allocated for objects:
|
||||
36.2% was used for memory not allocated for objects:
|
||||
|
||||
15.5% text stream storage 44240908 bytes in 276353 claims
|
||||
3.4% dictionary storage 9745408 bytes in 17371 claims
|
||||
---- sorting 976 bytes in 3 claims
|
||||
15.8% text stream storage 45362796 bytes in 282770 claims
|
||||
3.5% 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
|
||||
---- linguistic stock array 81920 bytes in 2 claims
|
||||
---- small word set array 105600 bytes in 22 claims
|
||||
0.8% inter symbols storage 2376560 bytes in 14944 claims
|
||||
5.9% inter bytecode storage 16802776 bytes in 14 claims
|
||||
0.8% inter symbols storage 2463600 bytes in 15377 claims
|
||||
5.8% inter bytecode storage 16802776 bytes in 14 claims
|
||||
3.0% inter links storage 8750208 bytes in 246 claims
|
||||
0.5% instance-of-kind counting 1695204 bytes in 1 claim
|
||||
---- compilation workspace for objects 21856 bytes in 25 claims
|
||||
---- lists for type-checking invocations 16000 bytes in 1 claim
|
||||
---- emitter array storage 147648 bytes in 1632 claims
|
||||
---- emitter array storage 175296 bytes in 2064 claims
|
||||
---- code generation workspace for objects 19736 bytes in 13 claims
|
||||
|
||||
20.7% was overhead - 59165544 bytes = 57778K = 56 MB
|
||||
20.1% was overhead - 57492712 bytes = 56145K = 54 MB
|
||||
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
100.0% in inform7 run
|
||||
63.7% in compilation to Inter
|
||||
26.0% in //ImperativeDefinitions::compile_first_block//
|
||||
9.4% in //Sequence::compile_function_resources//
|
||||
7.5% in //Strings::compile_responses//
|
||||
3.7% in //MajorNodes::pre_pass//
|
||||
3.3% in //MajorNodes::pass_1//
|
||||
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//
|
||||
3.6% in //MajorNodes::pre_pass//
|
||||
3.1% in //MajorNodes::pass_1//
|
||||
1.9% in //RTRules::RulePrintingRule_routine//
|
||||
1.9% in //RTRules::rulebooks_array_array//
|
||||
1.6% in //ImperativeDefinitions::assess_all//
|
||||
1.6% in //InferenceSubjects::emit_all//
|
||||
1.2% in //RTVerbs::ConjugateVerb//
|
||||
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//
|
||||
|
@ -17,15 +17,14 @@
|
|||
0.1% in //RTCommandGrammars::compile_all//
|
||||
0.1% in //RTKinds::compile_data_type_support_routines//
|
||||
0.1% in //Task::make_built_in_kind_constructors//
|
||||
0.1% in //World::stages_II_and_III//
|
||||
2.7% not specifically accounted for
|
||||
33.7% in running Inter pipeline
|
||||
11.9% in step preparation
|
||||
10.0% in inter step 2/14: link
|
||||
7.3% in inter step 14/14: generate inform6 -> auto.inf
|
||||
2.9% not specifically accounted for
|
||||
33.4% in running Inter pipeline
|
||||
12.0% in step preparation
|
||||
9.4% in inter step 2/14: link
|
||||
7.1% in inter step 14/14: generate inform6 -> auto.inf
|
||||
0.7% in inter step 10/14: consolidate-text
|
||||
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 10/14: consolidate-text
|
||||
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
|
||||
|
@ -33,6 +32,6 @@
|
|||
0.1% in inter step 6/14: assimilate
|
||||
0.1% in inter step 7/14: resolve-external-symbols
|
||||
0.1% in inter step 8/14: inspect-plugs
|
||||
2.3% not specifically accounted for
|
||||
2.1% not specifically accounted for
|
||||
1.9% in supervisor
|
||||
0.6% not specifically accounted for
|
||||
|
|
|
@ -333,7 +333,7 @@ void Translations::plus_responses(parse_node *p, rule *R) {
|
|||
} else {
|
||||
if (<extra-response>(Node::get_text(p))) {
|
||||
int code = <<r>>;
|
||||
response_message *resp = Strings::response_cue(NULL, R,
|
||||
response_message *resp = Responses::response_cue(NULL, R,
|
||||
code, Node::get_text(p), NULL, TRUE);
|
||||
Rules::set_response(R, code, resp);
|
||||
} else {
|
||||
|
|
|
@ -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);
|
||||
Strings::assert_response_value(R, c, Node::get_text(val));
|
||||
Responses::assert_response_value(R, c, Node::get_text(val));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -218,12 +218,11 @@ so on. Those absolute basics are made here.
|
|||
BENCH(PhraseRequests::invoke_to_begin)
|
||||
BENCH(Closures::compile_closures)
|
||||
BENCH(Sequence::compile_function_resources)
|
||||
BENCH(Strings::compile_responses)
|
||||
BENCH(Responses::compile_responses)
|
||||
BENCH(Sequence::compile_literal_resources)
|
||||
BENCH(RTRelations::compile_defined_relations)
|
||||
BENCH(Sequence::compile_function_resources)
|
||||
BENCH(TextSubstitutions::allow_no_further_text_subs)
|
||||
BENCH(Deferrals::allow_no_further_deferrals)
|
||||
BENCH(Sequence::allow_no_further_function_resources)
|
||||
|
||||
@<Generate inter, part 4@> =
|
||||
Task::advance_stage_to(INTER4_CSEQ, I"Generating inter (4)",
|
||||
|
@ -318,6 +317,20 @@ void Sequence::compile_function_resources(void) {
|
|||
iterations, (iterations == 1)?"":"s");
|
||||
}
|
||||
|
||||
@ The template layer calls the following when that midnight hour chimes:
|
||||
|
||||
=
|
||||
int no_further_function_resources = FALSE;
|
||||
|
||||
void Sequence::allow_no_further_function_resources(void) {
|
||||
no_further_function_resources = TRUE;
|
||||
}
|
||||
|
||||
int Sequence::function_resources_allowed(void) {
|
||||
if (no_further_function_resources) return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ And very similarly:
|
||||
|
||||
=
|
||||
|
|
|
@ -36,7 +36,7 @@ a number: all that matters is that the correct integer value is compiled.
|
|||
|
||||
@<Compile a literal-compilation-mode constant@> =
|
||||
int N = Rvalues::to_int(value);
|
||||
if (Holsters::data_acceptable(VH))
|
||||
if (Holsters::non_void_context(VH))
|
||||
Holsters::holster_pair(VH, LITERAL_IVAL, (inter_ti) N);
|
||||
|
||||
@ Whereas here, an instance is attached.
|
||||
|
@ -44,7 +44,7 @@ a number: all that matters is that the correct integer value is compiled.
|
|||
@<Compile a quantitative-compilation-mode constant@> =
|
||||
instance *I = Node::get_constant_instance(value);
|
||||
if (I) {
|
||||
if (Holsters::data_acceptable(VH)) {
|
||||
if (Holsters::non_void_context(VH)) {
|
||||
inter_name *N = RTInstances::emitted_iname(I);
|
||||
if (N) Emit::holster_iname(VH, N);
|
||||
else internal_error("no iname for instance");
|
||||
|
@ -106,11 +106,11 @@ kinds of value:
|
|||
}
|
||||
if (Kinds::Behaviour::is_object(kind_of_constant)) {
|
||||
if (Annotations::read_int(value, self_object_ANNOT)) {
|
||||
if (Holsters::data_acceptable(VH)) {
|
||||
if (Holsters::non_void_context(VH)) {
|
||||
Emit::holster_iname(VH, Hierarchy::find(SELF_HL));
|
||||
}
|
||||
} else if (Annotations::read_int(value, nothing_object_ANNOT)) {
|
||||
if (Holsters::data_acceptable(VH))
|
||||
if (Holsters::non_void_context(VH))
|
||||
Holsters::holster_pair(VH, LITERAL_IVAL, 0);
|
||||
} else {
|
||||
instance *I = Rvalues::to_instance(value);
|
||||
|
@ -141,7 +141,7 @@ kinds of value:
|
|||
}
|
||||
if (Kinds::get_construct(kind_of_constant) == CON_rulebook) {
|
||||
rulebook *rb = Rvalues::to_rulebook(value);
|
||||
if (Holsters::data_acceptable(VH))
|
||||
if (Holsters::non_void_context(VH))
|
||||
Holsters::holster_pair(VH, LITERAL_IVAL, (inter_ti) rb->allocation_id);
|
||||
return;
|
||||
}
|
||||
|
@ -158,12 +158,12 @@ kinds of value:
|
|||
}
|
||||
if (Kinds::get_construct(kind_of_constant) == CON_table_column) {
|
||||
table_column *tc = Rvalues::to_table_column(value);
|
||||
if (Holsters::data_acceptable(VH))
|
||||
if (Holsters::non_void_context(VH))
|
||||
Holsters::holster_pair(VH, LITERAL_IVAL, (inter_ti) RTTables::column_id(tc));
|
||||
return;
|
||||
}
|
||||
if (Kinds::eq(kind_of_constant, K_text)) {
|
||||
Strings::compile_general(VH, value);
|
||||
Responses::compile_general(VH, value);
|
||||
return;
|
||||
}
|
||||
#ifdef IF_MODULE
|
||||
|
@ -172,7 +172,7 @@ kinds of value:
|
|||
internal_error("Text no longer available for CONSTANT/UNDERSTANDING");
|
||||
inter_ti v1 = 0, v2 = 0;
|
||||
RTParsing::compile_understanding(&v1, &v2, Node::get_text(value));
|
||||
if (Holsters::data_acceptable(VH)) {
|
||||
if (Holsters::non_void_context(VH)) {
|
||||
Holsters::holster_pair(VH, v1, v2);
|
||||
}
|
||||
return;
|
||||
|
@ -180,7 +180,7 @@ kinds of value:
|
|||
#endif
|
||||
if (Kinds::eq(kind_of_constant, K_use_option)) {
|
||||
use_option *uo = Rvalues::to_use_option(value);
|
||||
if (Holsters::data_acceptable(VH))
|
||||
if (Holsters::non_void_context(VH))
|
||||
Holsters::holster_pair(VH, LITERAL_IVAL, (inter_ti) uo->allocation_id);
|
||||
return;
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ kinds of value:
|
|||
if (Kinds::eq(kind_of_constant, K_response)) {
|
||||
rule *R = Rvalues::to_rule(value);
|
||||
int c = Annotations::read_int(value, response_code_ANNOT);
|
||||
inter_name *iname = Strings::response_constant_iname(R, c);
|
||||
inter_name *iname = Responses::response_constant_iname(R, c);
|
||||
if (iname) Emit::holster_iname(VH, iname);
|
||||
else Holsters::holster_pair(VH, LITERAL_IVAL, 0);
|
||||
Rules::now_rule_needs_response(R, c, EMPTY_WORDING);
|
||||
|
@ -227,7 +227,7 @@ contexts by using a tilde: |~attr|.
|
|||
prn_to_eval = EitherOrProperties::get_negation(prn_to_eval);
|
||||
}
|
||||
|
||||
if (Holsters::data_acceptable(VH)) {
|
||||
if (Holsters::non_void_context(VH)) {
|
||||
if (parity == 1) {
|
||||
Emit::holster_iname(VH, RTProperties::iname(prn_to_eval));
|
||||
} else {
|
||||
|
@ -239,7 +239,7 @@ contexts by using a tilde: |~attr|.
|
|||
}
|
||||
}
|
||||
} else {
|
||||
if (Holsters::data_acceptable(VH)) {
|
||||
if (Holsters::non_void_context(VH)) {
|
||||
Emit::holster_iname(VH, RTProperties::iname(prn));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -110,18 +110,18 @@ Here |this| is the term in question, and |other| the other of the two.
|
|||
int N = t->constant_number;
|
||||
if ((N < 0) || (N >= 2)) internal_error("schemas are currently limited to *1 and *2");
|
||||
pcalc_term *this = ems->ops_termwise[N], *other = ems->ops_termwise[1-N];
|
||||
rule *R = adopted_rule_for_compilation;
|
||||
int M = adopted_marker_for_compilation;
|
||||
rule *R = rule_to_which_this_is_a_response;
|
||||
int M = response_marker_within_that_rule;
|
||||
if ((m & ADOPT_LOCAL_STACK_FRAME_ISSBM) &&
|
||||
(Rvalues::is_CONSTANT_of_kind(other->constant, K_response))) {
|
||||
adopted_rule_for_compilation = Rvalues::to_rule(other->constant);
|
||||
adopted_marker_for_compilation = Strings::get_marker_from_response_spec(other->constant);
|
||||
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);
|
||||
}
|
||||
kind *K = NULL;
|
||||
if (m & CAST_TO_KIND_OF_OTHER_TERM_ISSBM) K = other->term_checked_as_kind;
|
||||
CompileSchemas::compile_term_of_token(this, m, K, by_reference);
|
||||
adopted_rule_for_compilation = R;
|
||||
adopted_marker_for_compilation = M;
|
||||
rule_to_which_this_is_a_response = R;
|
||||
response_marker_within_that_rule = M;
|
||||
|
||||
@ This is for |*&|, which can only be used on the second term (i.e., term 1).
|
||||
If that is a combination of two values then we unpack those and compile them
|
||||
|
|
|
@ -33,28 +33,19 @@ typedef struct pcalc_prop_deferral {
|
|||
CLASS_DEFINITION
|
||||
} pcalc_prop_deferral;
|
||||
|
||||
@h The guillotine.
|
||||
We must be careful not to request a fresh deferral after the point at which
|
||||
all deferral requests are redeemed -- they would then never be reached.
|
||||
|
||||
=
|
||||
int no_further_deferrals = FALSE;
|
||||
void Deferrals::allow_no_further_deferrals(void) {
|
||||
no_further_deferrals = TRUE;
|
||||
}
|
||||
|
||||
@h Deferral requests.
|
||||
The following fills out the paperwork to request a deferred proposition.
|
||||
|
||||
=
|
||||
pcalc_prop_deferral *Deferrals::new(pcalc_prop *prop, int reason) {
|
||||
if (Sequence::function_resources_allowed() == FALSE)
|
||||
internal_error("too late now to defer propositions");
|
||||
pcalc_prop_deferral *pdef = CREATE(pcalc_prop_deferral);
|
||||
pdef->proposition_to_defer = prop;
|
||||
pdef->reason = reason;
|
||||
pdef->deferred_from = current_sentence;
|
||||
pdef->rtp_iname = NULL;
|
||||
pdef->ppd_iname = Enclosures::new_iname(PROPOSITIONS_HAP, PROPOSITION_HL);
|
||||
if (no_further_deferrals) internal_error("Too late now to defer propositions");
|
||||
return pdef;
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
Strings::index_response(OUT, R, l, R->responses[l].message);
|
||||
Responses::index_response(OUT, R, l, R->responses[l].message);
|
||||
c++;
|
||||
}
|
||||
if (c > 0) Index::extra_div_close_nested(OUT);
|
||||
|
|
|
@ -69,7 +69,7 @@ of |inter_ti| variables:
|
|||
|
||||
=
|
||||
void Emit::holster_iname(value_holster *VH, inter_name *iname) {
|
||||
if (Holsters::data_acceptable(VH)) {
|
||||
if (Holsters::non_void_context(VH)) {
|
||||
inter_ti v1 = 0, v2 = 0;
|
||||
Emit::to_value_pair(&v1, &v2, iname);
|
||||
Holsters::holster_pair(VH, v1, v2);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
[Strings::] Responses.
|
||||
[Responses::] Responses.
|
||||
|
||||
In this section we keep track of response texts.
|
||||
|
||||
|
@ -25,7 +25,7 @@ typedef struct response_message {
|
|||
is the "launcher" routine for a response:
|
||||
|
||||
=
|
||||
inter_name *Strings::response_launcher_iname(response_message *resp) {
|
||||
inter_name *Responses::response_launcher_iname(response_message *resp) {
|
||||
return resp->resp_iname;
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,7 @@ inter_name *Strings::response_launcher_iname(response_message *resp) {
|
|||
its name in the output code:
|
||||
|
||||
=
|
||||
inter_name *Strings::response_constant_iname(rule *R, int marker) {
|
||||
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");
|
||||
|
@ -59,13 +59,13 @@ 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 *Strings::response_cue(value_holster *VH, rule *owner, int marker,
|
||||
wording W, stack_frame *phsf, int via_I6) {
|
||||
response_message *Responses::response_cue(value_holster *VH, rule *owner, int marker,
|
||||
wording W, stack_frame *frame, int via_I6) {
|
||||
response_message *resp = CREATE(response_message);
|
||||
resp->original_stack_frame = Frames::boxed_frame(phsf);
|
||||
resp->original_stack_frame = Frames::boxed_frame(frame);
|
||||
resp->responding_rule = owner;
|
||||
resp->response_marker = marker;
|
||||
resp->original_text = TextSubstitutions::new_text_substitution(W, phsf, owner, marker, RTRules::package(owner));
|
||||
resp->original_text = TextSubstitutions::new_text_substitution(W, frame, owner, marker);
|
||||
resp->launcher_compiled = FALSE;
|
||||
resp->via_I6 = via_I6;
|
||||
resp->via_I6_routine_compiled = FALSE;
|
||||
|
@ -73,8 +73,8 @@ response_message *Strings::response_cue(value_holster *VH, rule *owner, int mark
|
|||
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::data_acceptable(VH)) {
|
||||
EmitCode::val_iname(K_value, Strings::response_launcher_iname(resp));
|
||||
if (Holsters::non_void_context(VH)) {
|
||||
EmitCode::val_iname(K_value, Responses::response_launcher_iname(resp));
|
||||
}
|
||||
}
|
||||
return resp;
|
||||
|
@ -86,7 +86,7 @@ doesn't matter, since so little is done and the response count can't be
|
|||
enormous.
|
||||
|
||||
=
|
||||
void Strings::compile_response_launchers(void) {
|
||||
void Responses::compile_response_launchers(void) {
|
||||
response_message *resp;
|
||||
LOOP_OVER(resp, response_message) {
|
||||
if (resp->launcher_compiled == FALSE) {
|
||||
|
@ -107,7 +107,7 @@ a call to an activity based on that value:
|
|||
|
||||
packaging_state save = Functions::begin(launcher);
|
||||
|
||||
inter_name *iname = Strings::response_constant_iname(
|
||||
inter_name *iname = Responses::response_constant_iname(
|
||||
resp->responding_rule, resp->response_marker);
|
||||
|
||||
inter_name *rname = Hierarchy::find(RESPONSEVIAACTIVITY_HL);
|
||||
|
@ -292,7 +292,7 @@ and some run-time tables which will enable the I6 template code to keep
|
|||
track of the content of each response.
|
||||
|
||||
=
|
||||
void Strings::compile_responses(void) {
|
||||
void Responses::compile_responses(void) {
|
||||
@<Compile the array holding the current text of each response@>;
|
||||
@<Compile the PrintResponse routine@>;
|
||||
@<Compile the Response Divisions array@>;
|
||||
|
@ -313,13 +313,12 @@ text for the response than the one we first created.
|
|||
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, RTRules::package(R));
|
||||
resp->original_text->dont_need_after_all = TRUE;
|
||||
ts = TextSubstitutions::new_text_substitution(W, NULL, R, marker);
|
||||
resp->original_text->tr_done_already = TRUE;
|
||||
}
|
||||
inter_name *ts_iname = TextSubstitutions::text_substitution_iname(ts);
|
||||
inter_name *rc_iname = Strings::response_constant_iname(R, marker);
|
||||
Emit::response(rc_iname, R, marker, ts_iname);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -334,7 +333,7 @@ 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 = Strings::response_constant_iname(resp->responding_rule,
|
||||
inter_name *iname = Responses::response_constant_iname(resp->responding_rule,
|
||||
resp->response_marker);
|
||||
EmitCode::inv(IF_BIP);
|
||||
EmitCode::down();
|
||||
|
@ -417,7 +416,7 @@ divided up by the extensions containing the rules which produce them.
|
|||
}
|
||||
|
||||
@ =
|
||||
stack_frame *Strings::frame_for_response(response_message *resp) {
|
||||
stack_frame *Responses::frame_for_response(response_message *resp) {
|
||||
if (resp == NULL) return NULL;
|
||||
return resp->original_stack_frame;
|
||||
}
|
||||
|
@ -426,7 +425,7 @@ stack_frame *Strings::frame_for_response(response_message *resp) {
|
|||
a given response even at compile time. But the rules code looks after that:
|
||||
|
||||
=
|
||||
void Strings::assert_response_value(rule *R, int marker, wording W) {
|
||||
void Responses::assert_response_value(rule *R, int marker, wording W) {
|
||||
Rules::now_rule_needs_response(R, marker, W);
|
||||
}
|
||||
|
||||
|
@ -434,7 +433,7 @@ void Strings::assert_response_value(rule *R, int marker, wording W) {
|
|||
text to assert a change:
|
||||
|
||||
=
|
||||
void Strings::index_response(OUTPUT_STREAM, rule *R, int marker, response_message *resp) {
|
||||
void Responses::index_response(OUTPUT_STREAM, rule *R, int marker, response_message *resp) {
|
||||
WRITE(" ");
|
||||
HTML_OPEN_WITH("span",
|
||||
"style=\"color: #ffffff; "
|
||||
|
@ -458,7 +457,7 @@ void Strings::index_response(OUTPUT_STREAM, rule *R, int marker, response_messag
|
|||
}
|
||||
|
||||
@ =
|
||||
int Strings::get_marker_from_response_spec(parse_node *rs) {
|
||||
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))))
|
||||
|
@ -481,16 +480,16 @@ but to something like an XML description of its metadata, where again the
|
|||
text needs to be printed in a particular way.
|
||||
|
||||
=
|
||||
void Strings::compile_general(value_holster *VH, parse_node *str) {
|
||||
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::data_acceptable(VH)) {
|
||||
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::data_acceptable(VH))
|
||||
if (Holsters::non_void_context(VH))
|
||||
Holsters::holster_pair(VH, LITERAL_IVAL, (inter_ti) A);
|
||||
}
|
||||
} else {
|
||||
|
@ -526,12 +525,12 @@ so the penultimate word, if it's there, is the letter.
|
|||
"some text as a response, then it can only occur once in its rule.");
|
||||
return;
|
||||
}
|
||||
stack_frame *phsf = Frames::current_stack_frame();
|
||||
if (Holsters::data_acceptable(VH)) {
|
||||
int downs = LocalParking::park(phsf);
|
||||
stack_frame *frame = Frames::current_stack_frame();
|
||||
if (Holsters::non_void_context(VH)) {
|
||||
int downs = LocalParking::park(frame);
|
||||
response_message *resp =
|
||||
Strings::response_cue(VH, rule_being_compiled, code, SW,
|
||||
Frames::boxed_frame(phsf), FALSE);
|
||||
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--; }
|
||||
}
|
||||
|
|
|
@ -43,12 +43,11 @@ inter_name *TextLiterals::small_block(inter_name *content) {
|
|||
}
|
||||
|
||||
@h Default value.
|
||||
The default text is empty. It's defined in //BasicInformKit//, but is equivalent
|
||||
to calling |TextLiterals::small_block(EMPTY_TEXT_PACKED_HL)|.
|
||||
The default text is empty:
|
||||
|
||||
=
|
||||
inter_name *TextLiterals::default_text(void) {
|
||||
return Hierarchy::find(EMPTY_TEXT_VALUE_HL);
|
||||
return TextLiterals::small_block(Hierarchy::find(EMPTY_TEXT_PACKED_HL));
|
||||
}
|
||||
|
||||
@h Suppressing apostrophe substitution.
|
||||
|
@ -85,7 +84,7 @@ inter_name *TextLiterals::to_value_unescaped(wording W) {
|
|||
inter_name *TextLiterals::to_value_inner(wording W, int unesc) {
|
||||
int w1 = Wordings::first_wn(W);
|
||||
if (Wide::cmp(Lexer::word_text(w1), L"\"\"") == 0)
|
||||
return Hierarchy::find(EMPTY_TEXT_VALUE_HL);
|
||||
return TextLiterals::default_text();
|
||||
|
||||
inter_name *content_iname = Enclosures::new_iname(LITERALS_HAP, TEXT_LITERAL_HL);
|
||||
Produce::annotate_i(content_iname, TEXT_LITERAL_IANN, 1);
|
||||
|
|
|
@ -2,127 +2,38 @@
|
|||
|
||||
In this section we compile text with substitutions.
|
||||
|
||||
@ Text containing substitutions, such as "You pick up [the noun] thoughtfully.",
|
||||
are compiled as routines rather than Z-machine strings. Each is stored in one
|
||||
of the following structures. Unlike literal text, a text routine might lead
|
||||
to problem messages when eventually compiled, so it is useful to record the
|
||||
current sentence when a text routine is created: this means a problem can
|
||||
be reported at the right place.
|
||||
|
||||
The easiest way to understand this section is to pretend that responses
|
||||
don't exist, and ignore them until they come up later.
|
||||
|
||||
@h Runtime representation.
|
||||
Text substitutions arise from source text such as:
|
||||
= (text as Inform 7)
|
||||
let Q be "the [fox speed] brown fox";
|
||||
say "Where has that [sleeping animal] got to?";
|
||||
=
|
||||
typedef struct text_substitution {
|
||||
struct wording unsubstituted_text; /* including the substitutions in squares */
|
||||
int dont_need_after_all; /* in case replaced as a response */
|
||||
int tr_done_already; /* has been compiled */
|
||||
struct rule *responding_to_rule;
|
||||
int responding_to_marker;
|
||||
struct parse_node *sentence_using_this; /* where this occurs in source */
|
||||
struct parse_node *owning_point; /* shows which compilation unit this belongs to */
|
||||
int local_names_existed_at_usage_time; /* remember in case of problems */
|
||||
struct stack_frame *parked_stack_frame; /* for cases where possible */
|
||||
struct inter_name *ts_iname; /* the I6 array for this */
|
||||
struct inter_name *ts_routine_iname; /* the routine to implement it */
|
||||
int ts_sb_needed; /* reference copy of small block needed as a constant? */
|
||||
CLASS_DEFINITION
|
||||
} text_substitution;
|
||||
|
||||
@ We are only allowed to create new ones until the following is set:
|
||||
|
||||
These both look like text substitutions, but only |the [fox speed] brown fox|
|
||||
actually is one: |say| phrases are compiled directly, like so:
|
||||
= (text as Inform 7)
|
||||
let Q be "the [fox speed] brown fox";
|
||||
say "Where has that ";
|
||||
say sleeping animal;
|
||||
say " got to?";
|
||||
=
|
||||
int no_further_text_subs = FALSE;
|
||||
|
||||
@ The following global variable records whether we are currently compiling
|
||||
a text routine, rather than some other routine, or free-standing objects.
|
||||
|
||||
= (early code)
|
||||
int compiling_text_routines_mode = FALSE; /* used for better problem messages */
|
||||
|
||||
@ Like literal texts, text substitutions aren't printed out in full when
|
||||
they first arise; we keep a note of them when we need them, and compile
|
||||
suitable routines later.
|
||||
|
||||
A problem with this is that a text substitution probably contains references
|
||||
to variables which exist now, but may not exist later when a routine to do
|
||||
the printing is being compiled. For example,
|
||||
|
||||
>> say "The dial reads [counter].";
|
||||
|
||||
may do quite different things at different points in the code, according to
|
||||
what |counter| currently means. So we need to take note of the current
|
||||
stack frame; and we mustn't optimise by compiling identical text substitutions
|
||||
to the same routines to print them.
|
||||
|
||||
So we are concerned only with substitutions used as values. At run-time, these
|
||||
are essentially the same as //Text Literals//, but where the content field in
|
||||
the small block is a function pointer:
|
||||
= (text)
|
||||
small block:
|
||||
Q ----------------> CONSTANT_PACKED_TEXT_STORAGE or CONSTANT_PERISHABLE_TEXT_STORAGE
|
||||
function
|
||||
=
|
||||
text_substitution *TextSubstitutions::new_text_substitution(wording W,
|
||||
stack_frame *phsf, rule *R, int marker, package_request *P) {
|
||||
text_substitution *ts = CREATE(text_substitution);
|
||||
if (no_further_text_subs) @<Panic, because it is really too late@>;
|
||||
ts->unsubstituted_text = Wordings::first_word(W);
|
||||
ts->sentence_using_this = current_sentence;
|
||||
ts->local_names_existed_at_usage_time = FALSE;
|
||||
if (R) {
|
||||
ts->parked_stack_frame = NULL;
|
||||
} else {
|
||||
stack_frame new_frame = Frames::new();
|
||||
ts->parked_stack_frame = Frames::boxed_frame(&new_frame);
|
||||
if (phsf) LocalVariableSlates::append(ts->parked_stack_frame, phsf);
|
||||
}
|
||||
ts->responding_to_rule = R;
|
||||
ts->responding_to_marker = marker;
|
||||
ts->dont_need_after_all = FALSE;
|
||||
ts->tr_done_already = FALSE;
|
||||
ts->ts_sb_needed = FALSE;
|
||||
if ((Functions::defn_being_compiled()) &&
|
||||
(LocalVariableSlates::size(Frames::current_stack_frame()) > 0))
|
||||
ts->local_names_existed_at_usage_time = TRUE;
|
||||
package_request *PR = Hierarchy::package_within(LITERALS_HAP, P);
|
||||
ts->ts_iname = Hierarchy::make_iname_in(TEXT_SUBSTITUTION_HL, PR);
|
||||
ts->ts_routine_iname = Hierarchy::make_iname_in(TEXT_SUBSTITUTION_FN_HL, PR);
|
||||
ts->owning_point = current_sentence;
|
||||
id_body *idb = Functions::defn_being_compiled();
|
||||
if (idb) ts->owning_point = idb->head_of_defn->at;
|
||||
LOGIF(TEXT_SUBSTITUTIONS, "Requesting text routine %d %08x %W %08x\n",
|
||||
ts->allocation_id, (int) phsf, W, R);
|
||||
return ts;
|
||||
}
|
||||
It is worth emphasising that this is a function. In an interpreted language
|
||||
like Perl, an interpolation such as |"Deleted $file_count files"| is immediately
|
||||
converted to text when it is executed; and even in some compiled languages
|
||||
like Swift, the same is essentially true -- in that the text is compiled to
|
||||
code which immediately produces the expanded version.
|
||||
|
||||
@ Timing is going to turn out to be a real problem in all of this code.
|
||||
If Inform finds that it needs a text substitution very late in its run --
|
||||
after it has compiled them and can't compile any more -- there's nothing
|
||||
to do but panic.
|
||||
|
||||
@<Panic, because it is really too late@> =
|
||||
internal_error("Too late for further text substitutions");
|
||||
|
||||
@ The template layer calls the following when that midnight hour chimes:
|
||||
|
||||
=
|
||||
void TextSubstitutions::allow_no_further_text_subs(void) {
|
||||
no_further_text_subs = TRUE;
|
||||
}
|
||||
|
||||
@ For some years these were compiled to routines verbosely called
|
||||
|text_routine_1| and so on, but no longer:
|
||||
|
||||
=
|
||||
inter_name *TextSubstitutions::text_substitution_iname(text_substitution *ts) {
|
||||
ts->ts_sb_needed = TRUE;
|
||||
return ts->ts_iname;
|
||||
}
|
||||
|
||||
@ The following is called when we want to compile a usage of a text
|
||||
substitution; for instance, when compiling
|
||||
|
||||
>> say "The time is [time of day]. Hurry!";
|
||||
|
||||
we'll compile a call to a routine like |TS_1()|, and make a note to compile
|
||||
that routine later. This appearance of the routine name is called the "cue".
|
||||
|
||||
In a value context, though, things may differ if we are dealing with a text
|
||||
substitution referring to local variables. Consider for example:
|
||||
In Inform, however, a text substitution is instead compiled to a function which
|
||||
can at some later time perform that expansion. This means it is, in effect, a
|
||||
form of closure, and has to retain some memory of the environment in which it
|
||||
came up. Consider for example:
|
||||
= (text as Inform 7)
|
||||
let X be 17;
|
||||
write "remember [X]" to the file of Memos;
|
||||
|
@ -131,116 +42,166 @@ This is a context where it's clear what it means to refer to the local variable
|
|||
|X| in the text. But this is less clear:
|
||||
= (text as Inform 7)
|
||||
let the cage be a random container in the Discount Cage Warehouse;
|
||||
now can't exit closed containers rule response (A) is "As bad as [a cage].";
|
||||
decide on "As bad as [a cage].";
|
||||
=
|
||||
The trouble is that the response text will be needed in stack frames other
|
||||
than this one, i.e., when the local variable |cage| has long since
|
||||
disappeared. The value of |cage| must be "captured", and we need the response
|
||||
text to be some kind of closure. In fact what we do is simpler -- we expand
|
||||
the text and stored it as what it expands to now, not a method for expanding
|
||||
it later. (This avoids issues of garbage collection on the captured values.)
|
||||
The trouble is that |decide on| causes a return out of the current stack frame;
|
||||
at which point the local variable |cage| will cease to exist, and it will then
|
||||
not be possible to expand |"As bad as [a cage]."|. If we were pursuing closures
|
||||
more seriously, we would have to capture |cage|, and then worry about garbage
|
||||
collection.
|
||||
|
||||
Instead we call a substitution like this "perishable", and in cases of doubt
|
||||
we expand this on the spot, i.e., inside the original stack frame.
|
||||
|
||||
=
|
||||
void TextSubstitutions::compile_value(inter_name *at, inter_name *fn,
|
||||
int makes_local_references) {
|
||||
packaging_state save = EmitArrays::begin(at, K_value);
|
||||
if (makes_local_references)
|
||||
EmitArrays::iname_entry(Hierarchy::find(CONSTANT_PERISHABLE_TEXT_STORAGE_HL));
|
||||
else
|
||||
EmitArrays::iname_entry(Hierarchy::find(CONSTANT_PACKED_TEXT_STORAGE_HL));
|
||||
EmitArrays::iname_entry(fn);
|
||||
EmitArrays::end(save);
|
||||
}
|
||||
|
||||
@h Cues.
|
||||
The "cue" for a text substitution that is not a response is its original appearance:
|
||||
like so:
|
||||
= (text as Inform 7)
|
||||
let Q be "the [fox speed] brown fox";
|
||||
=
|
||||
When compiling this value, the following is called with |W| being the single-word
|
||||
wording |"the [fox speed] brown fox"|.
|
||||
|
||||
=
|
||||
void TextSubstitutions::text_substitution_cue(value_holster *VH, wording W) {
|
||||
if (adopted_rule_for_compilation) {
|
||||
Rules::log(adopted_rule_for_compilation);
|
||||
}
|
||||
stack_frame *phsf = NULL;
|
||||
if (adopted_rule_for_compilation) {
|
||||
@<Write the actual cue@>;
|
||||
} else {
|
||||
if (Holsters::data_acceptable(VH)) {
|
||||
int downs = 0, captured = FALSE;
|
||||
if (VH->vhmode_wanted == INTER_VAL_VHMODE) {
|
||||
if (phsf == NULL) phsf = Frames::current_stack_frame();
|
||||
downs = LocalParking::park(phsf);
|
||||
phsf = Frames::boxed_frame(phsf);
|
||||
EmitCode::call(Hierarchy::find(TEXT_TY_EXPANDIFPERISHABLE_HL));
|
||||
EmitCode::down();
|
||||
Frames::emit_new_local_value(K_text);
|
||||
captured = TRUE;
|
||||
}
|
||||
text_substitution *ts = TextSubstitutions::new_text_substitution(W, phsf,
|
||||
adopted_rule_for_compilation, adopted_marker_for_compilation, Emit::current_enclosure());
|
||||
inter_name *tin = TextSubstitutions::text_substitution_iname(ts);
|
||||
if (VH->vhmode_wanted == INTER_DATA_VHMODE)
|
||||
Emit::holster_iname(VH, tin);
|
||||
else
|
||||
EmitCode::val_iname(K_value, tin);
|
||||
if (captured) {
|
||||
EmitCode::up();
|
||||
while (downs > 0) { EmitCode::up(); downs--; }
|
||||
}
|
||||
}
|
||||
text_substitution *ts = NULL;
|
||||
switch (VH->vhmode_wanted) {
|
||||
case INTER_VAL_VHMODE: @<Cue in value context@>; break;
|
||||
case INTER_DATA_VHMODE: @<Cue in data context@>; break;
|
||||
default: internal_error("cue in void context");
|
||||
}
|
||||
}
|
||||
|
||||
@<Write the actual cue@> =
|
||||
text_substitution *ts = TextSubstitutions::new_text_substitution(W, phsf,
|
||||
adopted_rule_for_compilation, adopted_marker_for_compilation, Emit::current_enclosure());
|
||||
if (CompileValues::compiling_in_constant_mode()) {
|
||||
inter_name *N = TextLiterals::small_block(ts->ts_routine_iname);
|
||||
Emit::holster_iname(VH, N);
|
||||
@ The function call to TEXT_TY_EXPANDIFPERISHABLE_HL is unnecessary in the
|
||||
case of a response to a rule, since those are never perishable.
|
||||
|
||||
@<Cue in value context@> =
|
||||
stack_frame *frame = NULL;
|
||||
if (rule_to_which_this_is_a_response) {
|
||||
@<Make the TS@>;
|
||||
inter_name *tin = TextSubstitutions::value_iname(ts);
|
||||
EmitCode::val_iname(K_value, tin);
|
||||
} else {
|
||||
inter_name *tin = TextSubstitutions::text_substitution_iname(ts);
|
||||
if (Holsters::data_acceptable(VH)) {
|
||||
if (tin) Emit::holster_iname(VH, tin);
|
||||
}
|
||||
if (frame == NULL) frame = Frames::current_stack_frame();
|
||||
int downs = LocalParking::park(frame);
|
||||
frame = Frames::boxed_frame(frame);
|
||||
@<Make the TS@>;
|
||||
inter_name *tin = TextSubstitutions::value_iname(ts);
|
||||
EmitCode::call(Hierarchy::find(TEXT_TY_EXPANDIFPERISHABLE_HL));
|
||||
EmitCode::down();
|
||||
Frames::emit_new_local_value(K_text);
|
||||
EmitCode::val_iname(K_value, tin);
|
||||
EmitCode::up();
|
||||
while (downs > 0) { EmitCode::up(); downs--; }
|
||||
}
|
||||
|
||||
@ And the following clarifies problem messages arising from this point,
|
||||
since it often confuses newcomers:
|
||||
@<Cue in data context@> =
|
||||
stack_frame *frame = NULL;
|
||||
@<Make the TS@>;
|
||||
inter_name *tin = TextSubstitutions::value_iname(ts);
|
||||
Emit::holster_iname(VH, tin);
|
||||
|
||||
@<Make the TS@> =
|
||||
ts = TextSubstitutions::new_text_substitution(W, frame,
|
||||
rule_to_which_this_is_a_response, response_marker_within_that_rule);
|
||||
|
||||
@h Substitutions.
|
||||
Each substitution creates an object like so:
|
||||
|
||||
=
|
||||
text_substitution *current_ts_being_compiled = NULL;
|
||||
int it_is_not_worth_adding = FALSE; /* To suppress the "It may be worth adding..." */
|
||||
typedef struct text_substitution {
|
||||
struct wording unsubstituted_text; /* including the substitutions in squares */
|
||||
int tr_done_already; /* has been compiled */
|
||||
struct parse_node *sentence_using_this; /* where this occurs in source */
|
||||
struct parse_node *owning_point; /* shows which compilation unit this belongs to */
|
||||
int local_names_existed_at_usage_time; /* remember in case of problems */
|
||||
struct stack_frame *using_frame; /* for cases where possible */
|
||||
|
||||
int TextSubstitutions::is_it_worth_adding(void) {
|
||||
return it_is_not_worth_adding;
|
||||
}
|
||||
void TextSubstitutions::it_is_worth_adding(void) {
|
||||
it_is_not_worth_adding = FALSE;
|
||||
}
|
||||
void TextSubstitutions::it_is_not_worth_adding(void) {
|
||||
it_is_not_worth_adding = TRUE;
|
||||
}
|
||||
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;
|
||||
int responding_to_marker;
|
||||
|
||||
@d ENDING_MESSAGE_PROBLEMS_CALLBACK TextSubstitutions::append_text_substitution_proviso
|
||||
CLASS_DEFINITION
|
||||
} text_substitution;
|
||||
|
||||
@ Two inames are involved here:
|
||||
= (text)
|
||||
small block:
|
||||
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.)
|
||||
|
||||
=
|
||||
void TextSubstitutions::append_text_substitution_proviso(void) {
|
||||
if (it_is_not_worth_adding) return;
|
||||
if (compiling_text_routines_mode == FALSE) return;
|
||||
if ((current_ts_being_compiled) &&
|
||||
(current_ts_being_compiled->local_names_existed_at_usage_time)) {
|
||||
Frames::log(Frames::current_stack_frame());
|
||||
Problems::quote_wording(9, current_ts_being_compiled->unsubstituted_text);
|
||||
Problems::issue_problem_segment(
|
||||
" %PIt may be worth adding that this problem arose in text "
|
||||
"which both contains substitutions and is also being used as "
|
||||
"a value - being put into a variable, or used as one of the "
|
||||
"ingredients in a phrase other than 'say'. Because that means "
|
||||
"it needs to be used in places outside its immediate context, "
|
||||
"it is not allowed to refer to any 'let' values or phrase "
|
||||
"options - those are temporary things, long gone by the time it "
|
||||
"would need to be printed.");
|
||||
}
|
||||
inter_name *TextSubstitutions::value_iname(text_substitution *ts) {
|
||||
ts->ts_value_iname_used = TRUE;
|
||||
return ts->ts_value_iname;
|
||||
}
|
||||
|
||||
@ So much for the cues. As with text literals in the previous section, it's
|
||||
now time to redeem our promises and compile the |TS_X| routines. These routines
|
||||
can't be produced all at once, and are sometimes not needed at all: the
|
||||
responses mechanism makes this quite fiddly, and so do the existence of
|
||||
other constructs in Inform which, when compiled, may make new text
|
||||
substitutions. So compilation is handled by a coroutine. (I'm a
|
||||
little old-fashioned in calling this a coroutine: it achieves its task in
|
||||
instalments, effectively sharing time with other routines which in turn
|
||||
add to its task, until everybody is done.)
|
||||
inter_name *TextSubstitutions::function_iname(text_substitution *ts) {
|
||||
return ts->ts_function_iname;
|
||||
}
|
||||
|
||||
Basically, we compile as many text substitutions as we can out of those not
|
||||
yet done, returning the number we compile.
|
||||
@
|
||||
|
||||
=
|
||||
text_substitution *TextSubstitutions::new_text_substitution(wording W,
|
||||
stack_frame *frame, rule *R, int marker) {
|
||||
|
||||
text_substitution *ts = CREATE(text_substitution);
|
||||
if (Sequence::function_resources_allowed() == FALSE)
|
||||
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 {
|
||||
stack_frame new_frame = Frames::new();
|
||||
ts->using_frame = Frames::boxed_frame(&new_frame);
|
||||
if (frame) LocalVariableSlates::append(ts->using_frame, frame);
|
||||
}
|
||||
ts->responding_to_rule = R;
|
||||
ts->responding_to_marker = marker;
|
||||
ts->tr_done_already = FALSE;
|
||||
|
||||
ts->local_names_existed_at_usage_time = FALSE;
|
||||
if ((Functions::defn_being_compiled()) &&
|
||||
(LocalVariableSlates::size(Frames::current_stack_frame()) > 0))
|
||||
ts->local_names_existed_at_usage_time = TRUE;
|
||||
|
||||
package_request *P = Emit::current_enclosure();
|
||||
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;
|
||||
id_body *idb = Functions::defn_being_compiled();
|
||||
if (idb) ts->owning_point = idb->head_of_defn->at;
|
||||
LOGIF(TEXT_SUBSTITUTIONS, "Requesting text routine %d %08x %W %08x\n",
|
||||
ts->allocation_id, (int) frame, W, R);
|
||||
return ts;
|
||||
}
|
||||
|
||||
@h Compilation.
|
||||
|
||||
=
|
||||
int TextSubstitutions::compilation_coroutine(void) {
|
||||
|
@ -248,8 +209,9 @@ int TextSubstitutions::compilation_coroutine(void) {
|
|||
}
|
||||
|
||||
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) {
|
||||
Strings::compile_response_launchers();
|
||||
Responses::compile_response_launchers();
|
||||
int N = 0;
|
||||
compiling_text_routines_mode = TRUE;
|
||||
while (TRUE) {
|
||||
|
@ -260,9 +222,11 @@ int TextSubstitutions::compile_as_needed(int in_response_mode) {
|
|||
latest_ts_compiled = ts;
|
||||
int responding = FALSE;
|
||||
if (ts->responding_to_rule) responding = TRUE;
|
||||
if ((ts->dont_need_after_all == FALSE) && (responding == in_response_mode) &&
|
||||
(ts->tr_done_already == FALSE)) {
|
||||
TextSubstitutions::compile_single_substitution(ts);
|
||||
if ((responding == in_response_mode) && (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);
|
||||
}
|
||||
N++;
|
||||
}
|
||||
|
@ -271,26 +235,30 @@ int TextSubstitutions::compile_as_needed(int in_response_mode) {
|
|||
return N;
|
||||
}
|
||||
|
||||
int TextSubstitutions::currently_compiling(void) {
|
||||
return compiling_text_routines_mode;
|
||||
}
|
||||
|
||||
@ We can now forget about the coroutine management, and just compile a single
|
||||
text substitution. The main thing is to copy over references to local variables
|
||||
from the stack frame creating this text substitution to the stack frame
|
||||
compiling it.
|
||||
|
||||
=
|
||||
void TextSubstitutions::compile_single_substitution(text_substitution *ts) {
|
||||
text_substitution *current_ts_being_compiled = NULL;
|
||||
int TextSubstitutions::compile_function(text_substitution *ts) {
|
||||
LOGIF(TEXT_SUBSTITUTIONS, "Compiling text routine %d %08x %W\n",
|
||||
ts->allocation_id, (int) (ts->parked_stack_frame), ts->unsubstituted_text);
|
||||
ts->allocation_id, (int) (ts->using_frame), ts->unsubstituted_text);
|
||||
|
||||
current_ts_being_compiled = ts;
|
||||
ts->tr_done_already = TRUE;
|
||||
packaging_state save = Functions::begin(ts->ts_routine_iname);
|
||||
stack_frame *phsf = ts->parked_stack_frame;
|
||||
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) phsf = Strings::frame_for_response(resp);
|
||||
if (resp) frame = Responses::frame_for_response(resp);
|
||||
}
|
||||
if (phsf) LocalVariableSlates::append(Frames::current_stack_frame(), phsf);
|
||||
if (frame) LocalVariableSlates::append(Frames::current_stack_frame(), frame);
|
||||
LocalVariables::monitor_local_parsing(Frames::current_stack_frame());
|
||||
|
||||
@<Compile a say-phrase@>;
|
||||
|
@ -299,21 +267,12 @@ void TextSubstitutions::compile_single_substitution(text_substitution *ts) {
|
|||
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(phsf);
|
||||
LocalParking::retrieve(frame);
|
||||
Produce::pop_code_position(Emit::tree());
|
||||
}
|
||||
Functions::end(save);
|
||||
|
||||
if (ts->ts_sb_needed) {
|
||||
packaging_state save = EmitArrays::begin(ts->ts_iname, K_value);
|
||||
if (makes_local_references)
|
||||
EmitArrays::iname_entry(Hierarchy::find(CONSTANT_PERISHABLE_TEXT_STORAGE_HL));
|
||||
else
|
||||
EmitArrays::iname_entry(Hierarchy::find(CONSTANT_PACKED_TEXT_STORAGE_HL));
|
||||
EmitArrays::iname_entry(ts->ts_routine_iname);
|
||||
EmitArrays::end(save);
|
||||
}
|
||||
current_ts_being_compiled = NULL;
|
||||
return makes_local_references;
|
||||
}
|
||||
|
||||
@ Of course, if we used Inform's standard phrase mechanism exactly, then
|
||||
|
@ -367,3 +326,42 @@ void TextSubstitutions::compile_text_routines_in_response_mode(void) {
|
|||
TextSubstitutions::compile_as_needed(TRUE);
|
||||
latest_ts_compiled = NULL;
|
||||
}
|
||||
|
||||
@h It may be worth adding.
|
||||
Finally, the following clarifies problem messages arising from the issue of
|
||||
local names being used in substitutions, since this often confuses newcomers:
|
||||
|
||||
@d ENDING_MESSAGE_PROBLEMS_CALLBACK TextSubstitutions::append_text_substitution_proviso
|
||||
|
||||
=
|
||||
int it_is_not_worth_adding = FALSE; /* To suppress the "It may be worth adding..." */
|
||||
|
||||
int TextSubstitutions::is_it_worth_adding(void) {
|
||||
return it_is_not_worth_adding;
|
||||
}
|
||||
void TextSubstitutions::it_is_worth_adding(void) {
|
||||
it_is_not_worth_adding = FALSE;
|
||||
}
|
||||
void TextSubstitutions::it_is_not_worth_adding(void) {
|
||||
it_is_not_worth_adding = TRUE;
|
||||
}
|
||||
|
||||
@ =
|
||||
void TextSubstitutions::append_text_substitution_proviso(void) {
|
||||
if (it_is_not_worth_adding) return;
|
||||
if (compiling_text_routines_mode == FALSE) return;
|
||||
if ((current_ts_being_compiled) &&
|
||||
(current_ts_being_compiled->local_names_existed_at_usage_time)) {
|
||||
Frames::log(Frames::current_stack_frame());
|
||||
Problems::quote_wording(9, current_ts_being_compiled->unsubstituted_text);
|
||||
Problems::issue_problem_segment(
|
||||
" %PIt may be worth adding that this problem arose in text "
|
||||
"which both contains substitutions and is also being used as "
|
||||
"a value - being put into a variable, or used as one of the "
|
||||
"ingredients in a phrase other than 'say'. Because that means "
|
||||
"it needs to be used in places outside its immediate context, "
|
||||
"it is not allowed to refer to any 'let' values or phrase "
|
||||
"options - those are temporary things, long gone by the time it "
|
||||
"would need to be printed.");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -282,16 +282,16 @@ change the strings of compiled code here without making a matching change in
|
|||
=
|
||||
void RTProperties::compile_value(value_holster *VH, property *prn, int val) {
|
||||
if (val) {
|
||||
if (Holsters::data_acceptable(VH))
|
||||
if (Holsters::non_void_context(VH))
|
||||
Holsters::holster_pair(VH, LITERAL_IVAL, 1);
|
||||
} else {
|
||||
if (Holsters::data_acceptable(VH))
|
||||
if (Holsters::non_void_context(VH))
|
||||
Holsters::holster_pair(VH, LITERAL_IVAL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void RTProperties::compile_default_value(value_holster *VH, property *prn) {
|
||||
if (Holsters::data_acceptable(VH))
|
||||
if (Holsters::non_void_context(VH))
|
||||
Holsters::holster_pair(VH, LITERAL_IVAL, 0);
|
||||
}
|
||||
|
||||
|
@ -326,7 +326,7 @@ void RTProperties::compile_vp_value(value_holster *VH, property *prn, parse_node
|
|||
|
||||
void RTProperties::compile_vp_default_value(value_holster *VH, property *prn) {
|
||||
if (RTProperties::uses_non_typesafe_0(prn)) {
|
||||
if (Holsters::data_acceptable(VH))
|
||||
if (Holsters::non_void_context(VH))
|
||||
Holsters::holster_pair(VH, LITERAL_IVAL, 0);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -6,8 +6,8 @@ To compile run-time support for rules.
|
|||
|
||||
= (early code)
|
||||
rule *rule_being_compiled = NULL; /* rule whose phrase's definition is being compiled */
|
||||
rule *adopted_rule_for_compilation = NULL; /* when a new response is being compiled */
|
||||
int adopted_marker_for_compilation = -1; /* when a new response is being compiled */
|
||||
rule *rule_to_which_this_is_a_response = NULL; /* when a new response is being compiled */
|
||||
int response_marker_within_that_rule = -1; /* when a new response is being compiled */
|
||||
|
||||
@ In Inter code, a rule is compiled to the name of the routine implementing it.
|
||||
|
||||
|
|
|
@ -151,7 +151,7 @@ int RTKinds::compile_default_value_vh(value_holster *VH, kind *K,
|
|||
inter_ti v1 = 0, v2 = 0;
|
||||
RTKinds::get_default_value(&v1, &v2, K);
|
||||
if (v1 != 0) {
|
||||
if (Holsters::data_acceptable(VH)) {
|
||||
if (Holsters::non_void_context(VH)) {
|
||||
Holsters::holster_pair(VH, v1, v2);
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -360,7 +360,7 @@ int RTActions::actions_compile_constant(value_holster *VH, kind *K, parse_node *
|
|||
internal_error("actions plugin inactive");
|
||||
if (Kinds::eq(K, K_action_name)) {
|
||||
action_name *an = ARvalues::to_action_name(spec);
|
||||
if (Holsters::data_acceptable(VH)) {
|
||||
if (Holsters::non_void_context(VH)) {
|
||||
inter_name *N = RTActions::iname(an);
|
||||
if (N) Emit::holster_iname(VH, N);
|
||||
}
|
||||
|
|
|
@ -2521,7 +2521,7 @@ helpful about what exactly is wrong.
|
|||
|
||||
int preceding = Wordings::first_wn(Node::get_text(p)) - 1;
|
||||
if ((preceding >= 0) && (current_sentence) &&
|
||||
(((compiling_text_routines_mode) || (shape == SAY_UTSHAPE))) &&
|
||||
(((TextSubstitutions::currently_compiling()) || (shape == SAY_UTSHAPE))) &&
|
||||
((preceding == Wordings::first_wn(Node::get_text(current_sentence)))
|
||||
|| (Lexer::word(preceding) == COMMA_V)))
|
||||
@<Unknown found text occurs as a text substitution@>
|
||||
|
|
|
@ -29,7 +29,7 @@ value_holster Holsters::new(int vhm) {
|
|||
@h Conversions.
|
||||
|
||||
=
|
||||
int Holsters::data_acceptable(value_holster *vh) {
|
||||
int Holsters::non_void_context(value_holster *vh) {
|
||||
if (vh == NULL) internal_error("no VH");
|
||||
if ((vh->vhmode_wanted == INTER_DATA_VHMODE) ||
|
||||
(vh->vhmode_wanted == INTER_VAL_VHMODE)) return TRUE;
|
||||
|
|
|
@ -18,8 +18,6 @@ inter_tree_node **text_consolidation_list = NULL;
|
|||
int CodeGen::PackedText::run_pipeline_stage(pipeline_step *step) {
|
||||
InterTree::traverse(step->repository, CodeGen::PackedText::visitor, NULL, NULL, 0);
|
||||
if (text_consolidation_list_used > 0) {
|
||||
LOG("%d text literals:\n", text_consolidation_list_used);
|
||||
|
||||
qsort(text_consolidation_list, (size_t) text_consolidation_list_used, sizeof(inter_tree_node *),
|
||||
CodeGen::PackedText::compare_texts);
|
||||
|
||||
|
@ -33,7 +31,6 @@ int CodeGen::PackedText::run_pipeline_stage(pipeline_step *step) {
|
|||
inter_tree_node *P = text_consolidation_list[i];
|
||||
text_stream *S = CodeGen::PackedText::unpack(P);
|
||||
if (Str::cmp(S, current) != 0) {
|
||||
LOG("%d: %S\n", j++, S);
|
||||
TEMPORARY_TEXT(ALPHA)
|
||||
WRITE_TO(ALPHA, "alphabetised_text_%d", j);
|
||||
inter_ti ID = Inter::Warehouse::create_text(InterTree::warehouse(I),
|
||||
|
@ -65,8 +62,6 @@ int CodeGen::PackedText::run_pipeline_stage(pipeline_step *step) {
|
|||
inter_symbol *con_name =
|
||||
InterSymbolsTables::symbol_from_frame_data(P, DEFN_CONST_IFLD);
|
||||
Inter::Symbols::unannotate(con_name, TEXT_LITERAL_IANN);
|
||||
|
||||
LOG("P%d = %d\n", i, j-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -50,7 +50,6 @@ void CodeGen::FC::frame(code_generation *gen, inter_tree_node *P) {
|
|||
inter_ti ID = P->W.data[DATA_CONST_IFLD];
|
||||
text_stream *S = CodeGen::CL::literal_text_at(gen,
|
||||
Inode::ID_to_text(P, ID));
|
||||
LOG("$3 has tli\n", con_name);
|
||||
CodeGen::select_temporary(gen, S);
|
||||
CodeGen::CL::constant(gen, P);
|
||||
CodeGen::deselect_temporary(gen);
|
||||
|
|
Loading…
Reference in a new issue