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

Replaced coroutine compilation system with a task queue

This commit is contained in:
Graham Nelson 2021-04-25 23:49:45 +01:00
parent ec8f68e4ea
commit 4fdc63a2ec
35 changed files with 709 additions and 610 deletions

View file

@ -84,6 +84,8 @@ function togglePopup(material_id) {
other two; it doesn't even have an activation function.
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">TASK_QUEUE_DA</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">plugin</span><span class="plain-syntax"> *</span><span class="identifier-syntax">core_plugin</span><span class="plain-syntax">, *</span><span class="identifier-syntax">naming_plugin</span><span class="plain-syntax">, *</span><span class="identifier-syntax">counting_plugin</span><span class="plain-syntax">;</span>
@ -93,6 +95,8 @@ other two; it doesn't even have an activation function.
<span class="plain-syntax"> </span><span class="identifier-syntax">naming_plugin</span><span class="plain-syntax"> = </span><a href="3-pm.html#SP1" class="function-link"><span class="function-syntax">PluginManager::new</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">Naming::start</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"naming"</span><span class="plain-syntax">, </span><span class="identifier-syntax">core_plugin</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">counting_plugin</span><span class="plain-syntax"> = </span><a href="3-pm.html#SP1" class="function-link"><span class="function-syntax">PluginManager::new</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">PL::Counting::start</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"instance counting"</span><span class="plain-syntax">, </span><span class="identifier-syntax">core_plugin</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Log::declare_aspect</span><span class="plain-syntax">(</span><span class="constant-syntax">TASK_QUEUE_DA</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"task queue"</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Writers::register_writer_I</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">, &amp;</span><a href="1-cm.html#SP3" class="function-link"><span class="function-syntax">CoreModule::writer</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-cp2.html#SP3" class="function-link"><span class="function-syntax">CorePreform::set_core_internal_NTIs</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="1-inaa.html#SP8" class="function-link"><span class="function-syntax">CoreSyntax::declare_annotations</span></a><span class="plain-syntax">();</span>

View file

@ -75,9 +75,11 @@ of each other or of <a href="index.html" class="internal">core</a> in any case.
We begin with <a href="index.html" class="internal">core</a> itself.
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">compile_task_data_CLASS</span>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">compilation_subtask_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">compile_task_data_CLASS</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">compile_task_data</span><span class="plain-syntax">)</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b><a href="../assertions-module/index.html" class="internal">assertions</a> &mdash;

View file

@ -110,9 +110,12 @@ then the sequence itself.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_sequence_bench</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">Sequence::carry_out</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">Sequence::carry_out</span></span>:<br/>What To Compile - <a href="1-wtc.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">debugging</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stopwatch_timer</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">Time::start_stopwatch</span><span class="plain-syntax">(</span><span class="identifier-syntax">inform7_timer</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"compilation to Inter"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sequence_bench</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-htc.html#SP2_2" class="named-paragraph-link"><span class="named-paragraph">Divide into compilation units</span><span class="named-paragraph-number">2.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-htc.html#SP2_3" class="named-paragraph-link"><span class="named-paragraph">Build a rudimentary set of kinds, relations, verbs and inference subjects</span><span class="named-paragraph-number">2.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-htc.html#SP2_4" class="named-paragraph-link"><span class="named-paragraph">Pass three times through the major nodes</span><span class="named-paragraph-number">2.4</span></a></span><span class="plain-syntax">;</span>
@ -126,7 +129,7 @@ then the sequence itself.
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-htc.html#SP2_12" class="named-paragraph-link"><span class="named-paragraph">Generate inter, part 4</span><span class="named-paragraph-number">2.12</span></a></span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-htc.html#SP2_13" class="named-paragraph-link"><span class="named-paragraph">Generate inter, part 5</span><span class="named-paragraph-number">2.13</span></a></span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-htc.html#SP2_14" class="named-paragraph-link"><span class="named-paragraph">Generate index and bibliographic file</span><span class="named-paragraph-number">2.14</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">problem_count</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><a href="1-htc.html#SP10" class="function-link"><span class="function-syntax">Sequence::throw_error_if_subtasks_remain</span></a><span class="plain-syntax">();</span>
<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">FINISHED_CSEQ</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Ccmplete"</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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cpu_time_used</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Time::stop_stopwatch</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">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Compile CPU time: %d centiseconds\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">cpu_time_used</span><span class="plain-syntax">);</span>
@ -161,6 +164,8 @@ as possible.
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::put_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="character-syntax">':'</span><span class="plain-syntax">); </span><span class="identifier-syntax">Str::put_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">+1, </span><span class="character-syntax">':'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stopwatch_timer</span><span class="plain-syntax"> *</span><span class="identifier-syntax">st</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Time::start_stopwatch</span><span class="plain-syntax">(</span><span class="identifier-syntax">sequence_timer</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">current_sequence_bench</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">current_sequence_bench</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">routine</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">cs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Time::stop_stopwatch</span><span class="plain-syntax">(</span><span class="identifier-syntax">st</span><span class="plain-syntax">);</span>
@ -337,15 +342,14 @@ 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#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><a href="1-htc.html#SP9" class="function-link"><span class="function-syntax">Sequence::undertake_queued_tasks</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_synoptic_resources</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="1-htc.html#SP5" class="function-link"><span class="function-syntax">Sequence::compile_literal_resources</span></a><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTRelations::compile_defined_relations</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="1-htc.html#SP3" class="function-link"><span class="function-syntax">Sequence::compile_function_resources</span></a><span class="plain-syntax">)</span>
<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>
<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#SP9" class="function-link"><span class="function-syntax">Sequence::undertake_queued_tasks</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#SP8" class="function-link"><span class="function-syntax">Sequence::allow_no_further_queued_tasks</span></a><span class="plain-syntax">)</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="1-htc.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_12" class="paragraph-anchor"></a><b>&#167;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>
@ -364,8 +368,6 @@ 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">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#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>
@ -415,84 +417,201 @@ function compilation in order to provide a context for execution of the phrase
"a random number between 5 and 10", which in turn... and so on.
</p>
<p class="commentary">The only way to be sure of handling all needs here is to keep on compiling
until the process exhausts itself, and this we do. The process is structured
as a set of coroutines<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> which each carry out as much as they can of the work
which has arisen since they were last called, then return how much they did.
Each may indirectly create work for the others, so we repeat until they are
all happy.
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>The only way to be sure of handling all needs here is to keep on compiling
until the process exhausts itself, and this we do with a queue of tasks to
perform.<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> Suppose we have this queue:
</p>
<p class="commentary">The result terminates since eventually every "To..." phrase definition will
have been compiled with every possible interpretation of its kinds. After that,
everything fizzles out quickly, because none of the other resources here are
able to create new work for each other. The safety cutout in this function is
just defensive programming, and has never been activated. Typically only
one or two iterations are needed in practical cases.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> T1 -&gt; T2 -&gt; T3 -&gt; T4 -&gt; ...</span>
</pre>
<p class="commentary">and we are working on T2. That uncovers the need for three further tasks
X1, X2, X3: those are added immediately after T2 &mdash;
</p>
<ul class="footnotetexts"><li class="footnote" id="fn:1"><p class="inwebfootnote"><sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> C does not support coroutines, though that hasn't stopped hackers from using
assembly language to manipulate return addresses on the C call stack, and/or use
<a href="https://en.wikipedia.org/wiki/Duff%27s_device" class="external">Duff's device</a>. We avoid
all that by using regular C functions which merely imitate coroutines by
cooperatively giving way to each other. They <span class="extract"><span class="extract-syntax">return</span></span> to the central organising
function <a href="1-htc.html#SP3" class="internal">Sequence::compile_function_resources</a>, not directly into each
other's bodies. But I think the term "coroutine" is reasonable just the same.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> T1 -&gt; T2 -&gt; X1 -&gt; X2 -&gt; X3 -&gt; T3 -&gt; T4 -&gt; ...</span>
</pre>
<p class="commentary">Thus we never reach T3 until T2 has been completely exhausted, including its
secondary tasks. To get a sense of how this works in practice, try:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">Include task queue in the debugging log.</span>
</pre>
<ul class="footnotetexts"><li class="footnote" id="fn:1"><p class="inwebfootnote"><sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> Until 2021 this process is structured as a set of coroutines rather than a
queue. C does not strictly speaking support coroutines, though that hasn't stopped
hackers from using assembly language to manipulate return addresses on the C call
stack, and/or use
<a href="https://en.wikipedia.org/wiki/Duff%27s_device" class="external">Duff's device</a>. It never
quite came to that here, but it was sometimes difficult to reason about.
<a href="#fnref:1" title="return to text"> &#x21A9;</a></p></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">Sequence::compile_function_resources</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">Sequence::compile_function_resources</span></span>:<br/><a href="1-htc.html#SP2_11">&#167;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="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>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PhraseRequests::compilation_coroutine</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">GroupTogether::compilation_coroutine</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LoopingOverScope::compilation_coroutine</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Responses::compilation_coroutine</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TextSubstitutions::compilation_coroutine</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">DeferredPropositions::compilation_coroutine</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">problem_count</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">iterations</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">10</span><span class="plain-syntax">)) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">iterations</span><span class="plain-syntax">--; </span><span class="comment-syntax"> since the final round is one where everyone does nothing</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">iterations</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">".... Sequence::compile_function_resources completed in %d iteration%s\n"</span><span class="plain-syntax">,</span>
<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>&#167;4. </b>The template layer calls the following when that midnight hour chimes:
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>A task is abstracted as being a call to a function, called the "agent", with
a pointer to the relevant data.
</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_function_resources</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">caused_by</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_task</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">agent</span><span class="plain-syntax">)(</span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">compilation_subtask</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">general_pointer</span><span class="plain-syntax"> </span><span class="identifier-syntax">data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_sentence_when_queued</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">description</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">compilation_subtask</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">&#167;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="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="function-syntax">Sequence::new_subtask</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">Sequence::new_subtask</span></span>:<br/><a href="1-htc.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">agent</span><span class="plain-syntax">)(</span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">general_pointer</span><span class="plain-syntax"> </span><span class="identifier-syntax">gp</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</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">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">caused_by</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">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_task</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">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">agent</span><span class="plain-syntax"> = </span><span class="identifier-syntax">agent</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gp</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">current_sentence_when_queued</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">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">description</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>And very similarly:
<ul class="endnotetexts"><li>The structure compilation_subtask is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>Each call to <a href="1-htc.html#SP9" class="internal">Sequence::undertake_queued_tasks</a> works methodically through
the queue until everything is done.
</p>
<p class="commentary">The queue is a linked list of <span class="extract"><span class="extract-syntax">compilation_subtask</span></span> objects in between <span class="extract"><span class="extract-syntax">first_task</span></span>
and <span class="extract"><span class="extract-syntax">last_task</span></span>. (The queue is empty if and only if both are <span class="extract"><span class="extract-syntax">NULL</span></span>.) The queue
only grows, and never has items removed.
</p>
<p class="commentary">A marker called <span class="extract"><span class="extract-syntax">last_task_undetaken</span></span> shows how much progress we have made in
completing the tasks queued: so, when this is equal to <span class="extract"><span class="extract-syntax">last_task</span></span>, there is
nothing to do. Another marker called <span class="extract"><span class="extract-syntax">current_task</span></span> is set only when a task
is under way, and is <span class="extract"><span class="extract-syntax">NULL</span></span> at all other times.
</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">&#167;2.11</a>, <a href="1-htc.html#SP2_13">&#167;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>
<span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">last_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">last_task_undetaken</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">current_horizon</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">task_queue_is_closed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>The rest of Inform, if it wants to schedule a compilation task, should call
one of these two functions:
</p>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ListLiterals::compile_support_matter</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">BoxQuotations::compile_support_matter</span><span class="plain-syntax">() &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<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::queue</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">agent</span><span class="plain-syntax">)(</span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">general_pointer</span><span class="plain-syntax"> </span><span class="identifier-syntax">gp</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</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">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><a href="1-htc.html#SP5" class="function-link"><span class="function-syntax">Sequence::new_subtask</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">agent</span><span class="plain-syntax">, </span><span class="identifier-syntax">gp</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-htc.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Queue the task</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">problem_count</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">iterations</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">10</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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sequence::queue_at</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">agent</span><span class="plain-syntax">)(</span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">general_pointer</span><span class="plain-syntax"> </span><span class="identifier-syntax">gp</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">at</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><a href="1-htc.html#SP5" class="function-link"><span class="function-syntax">Sequence::new_subtask</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">agent</span><span class="plain-syntax">, </span><span class="identifier-syntax">gp</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">current_sentence_when_queued</span><span class="plain-syntax"> = </span><span class="identifier-syntax">at</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-htc.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Queue the task</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="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b>New entries are inserted in the queue at two write positions:
</p>
<ul class="items"><li>&#9679; after the <span class="extract"><span class="extract-syntax">last_task</span></span>, i.e., at the back, if no task is currently going on; or
</li><li>&#9679; after the <span class="extract"><span class="extract-syntax">current_horizon</span></span> marker, i.e., after the current task finishes.
</li></ul>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Queue the task</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">
<span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">caused_by</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_task</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">first_task</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">first_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">; </span><span class="identifier-syntax">last_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</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_horizon</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_horizon</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_task</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_horizon</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_horizon</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_task</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">last_task</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">last_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">iterations</span><span class="plain-syntax">--; </span><span class="comment-syntax"> since the final round is one where everyone does nothing</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">iterations</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">".... Sequence::compile_literal_resources completed in %d iteration%s\n"</span><span class="plain-syntax">,</span>
<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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">caused_by</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">description</span><span class="plain-syntax">, </span><span class="string-syntax">" from [%d]"</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">caused_by</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">description</span><span class="plain-syntax">, </span><span class="string-syntax">" from %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">current_sequence_bench</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">task_queue_is_closed</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">"offending task was: "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-htc.html#SP11" class="function-link"><span class="function-syntax">Sequence::write_task</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"too late to schedule further compilation tasks"</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">Log::aspect_switched_on</span><span class="plain-syntax">(</span><span class="constant-syntax">TASK_QUEUE_DA</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">"queued: "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-htc.html#SP11" class="function-link"><span class="function-syntax">Sequence::write_task</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="1-htc.html#SP7">&#167;7</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>Here the chimes of midnight sound:
</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::allow_no_further_queued_tasks</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_queued_tasks</span></span>:<br/><a href="1-htc.html#SP2_11">&#167;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">task_queue_is_closed</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="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>So here is where the work is done, and the <span class="extract"><span class="extract-syntax">last_task_undetaken</span></span> advances:
</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::undertake_queued_tasks</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::undertake_queued_tasks</span></span>:<br/><a href="1-htc.html#SP2_11">&#167;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="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">do</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><span class="identifier-syntax">first_task</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">last_task_undetaken</span><span class="plain-syntax">) </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><span class="identifier-syntax">last_task_undetaken</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_task</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">last_task_undetaken</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">save_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_task</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">save_horizon</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_horizon</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_horizon</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">current_sentence_when_queued</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (*(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">agent</span><span class="plain-syntax">))(</span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Log::aspect_switched_on</span><span class="plain-syntax">(</span><span class="constant-syntax">TASK_QUEUE_DA</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">"completed: "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-htc.html#SP11" class="function-link"><span class="function-syntax">Sequence::write_task</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">save</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">save_task</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_horizon</span><span class="plain-syntax"> = </span><span class="identifier-syntax">save_horizon</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">save</span><span class="plain-syntax">;</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">t</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>At the end of compilation, the queue ought to be empty, but just in case:
</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::throw_error_if_subtasks_remain</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">Sequence::throw_error_if_subtasks_remain</span></span>:<br/><a href="1-htc.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">first_task</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><span class="identifier-syntax">first_task</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">last_task_undetaken</span><span class="plain-syntax">) </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><span class="identifier-syntax">last_task_undetaken</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_task</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="1-htc.html#SP11" class="function-link"><span class="function-syntax">Sequence::write_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"there are compilation tasks never reached"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>And these are used for logging:
</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::write_from</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">Sequence::write_from</span></span>:<br/><a href="1-htc.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="1-htc.html#SP11" class="function-link"><span class="function-syntax">Sequence::write_task</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_task</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">Sequence::write_task</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">Sequence::write_task</span></span>:<br/><a href="1-htc.html#SP7_1">&#167;7.1</a>, <a href="1-htc.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"[%d] %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">description</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">

View file

@ -253,6 +253,11 @@ list is a list of. The result would be:
<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="identifier-syntax">Hierarchy::package_within</span><span class="plain-syntax">(</span><span class="identifier-syntax">REQUESTS_HAP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-cid.html#SP7" class="function-link"><span class="function-syntax">CompileImperativeDefn::requests_package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">req_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::make_iname_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">PHRASE_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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="string-syntax">"phrase request (%u) for '%W'"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compile_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">head_of_defn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="3-pr.html#SP4" class="function-link"><span class="function-syntax">PhraseRequests::compilation_agent</span></a><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_to_phrase_request</span><span class="plain-syntax">(</span><span class="identifier-syntax">req</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">req</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-pr.html#SP2">&#167;2</a>.</li></ul>
@ -270,28 +275,17 @@ list is a list of. The result would be:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kv_interpretation</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>The following coroutine acts on any pending requests for phrase compilation
since the last time it was called: see <a href="../core-module/1-htc.html" class="internal">How To Compile (in core)</a>.
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>The following agent acts on a pending requests for phrase compilation: see
<a href="../core-module/1-htc.html" class="internal">How To Compile (in core)</a>.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">to_phrase_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PhraseRequests::compilation_coroutine</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">to_phrase_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">req</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">req</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FIRST_OBJECT</span><span class="plain-syntax">(</span><span class="reserved-syntax">to_phrase_request</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">req</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEXT_OBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax">, </span><span class="reserved-syntax">to_phrase_request</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">req</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">latest_request_granted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">req</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="3-cid.html#SP2" class="function-link"><span class="function-syntax">CompileImperativeDefn::go</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compile_from</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-cid.html#SP1" class="function-link"><span class="function-syntax">CompileImperativeDefn::advance_progress_bar</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compile_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> &amp;</span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">total_phrases_to_compile</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compile_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">at_least_one_compiled_form_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PhraseRequests::compilation_agent</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">PhraseRequests::compilation_agent</span></span>:<br/><a href="3-pr.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">task</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">to_phrase_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">req</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_to_phrase_request</span><span class="plain-syntax">(</span><span class="identifier-syntax">task</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-cid.html#SP2" class="function-link"><span class="function-syntax">CompileImperativeDefn::go</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compile_from</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-cid.html#SP1" class="function-link"><span class="function-syntax">CompileImperativeDefn::advance_progress_bar</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compile_from</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> &amp;</span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">total_phrases_to_compile</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compile_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">at_least_one_compiled_form_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>In Basic Inform, only, execution begins at the "To..." phrase "To begin", and

View file

@ -123,29 +123,18 @@ MathJax = {
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Preliminaries. </b>Propositions are deferred for diverse reasons: see <a href="4-dtd.html" class="internal">Deciding to Defer</a>. Here
we take our medicine, and actually compile those deferred propositions into
functions. This is part of the phrase-compilation-coroutine process because
funny things can happen when we compile: we can create new text substitutions
which create routines which... and so on. (See <a href="../core-module/1-htc.html" class="internal">How To Compile (in core)</a>.)
functions. This has to be done by an agent because funny things can happen
when we compile: we can create new text substitutions which create routines
which... and so on. (See <a href="../core-module/1-htc.html" class="internal">How To Compile (in core)</a>.)
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">latest_pcd</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">DeferredPropositions::compilation_coroutine</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">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">latest_pcd</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">FIRST_OBJECT</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="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEXT_OBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">latest_pcd</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="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">latest_pcd</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><a href="4-cdp.html#SP3" class="function-link"><span class="function-syntax">DeferredPropositions::compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">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">save_current_pdef</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">DeferredPropositions::compilation_agent</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">DeferredPropositions::compilation_agent</span></span>:<br/>Deciding to Defer - <a href="4-dtd.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_pcalc_prop_deferral</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">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><a href="4-cdp.html#SP3" class="function-link"><span class="function-syntax">DeferredPropositions::compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">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">save_current_pdef</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>The basic structure of a proposition function is the same for all of the
@ -162,7 +151,7 @@ this is plenty large enough:
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_QC_VARIABLES</span><span class="plain-syntax"> </span><span class="constant-syntax">100</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">DeferredPropositions::compile</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">DeferredPropositions::compile</span></span>:<br/><a href="4-cdp.html#SP2">&#167;2</a></span></button><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">void</span><span class="plain-syntax"> </span><span class="function-syntax">DeferredPropositions::compile</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">DeferredPropositions::compile</span></span>:<br/><a href="4-cdp.html#SP2">&#167;2</a></span></button><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">ct_locals_problem_thrown</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">negated_quantifier_found</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">deferred_from</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">proposition</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Propositions::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">proposition_to_defer</span><span class="plain-syntax">);</span>
@ -1984,7 +1973,7 @@ kinds cannot be changed at run-time.
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> </span><span class="identifier-syntax">loop_schema</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="function-syntax">DeferredPropositions::compile_loop_header</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">DeferredPropositions::compile_loop_header</span></span>:<br/><a href="4-cdp.html#SP3_6_1_4_3_5">&#167;3.6.1.4.3.5</a>, <a href="4-cdp.html#SP3_6_1_7">&#167;3.6.1.7</a>, <a href="4-cdp.html#SP3_6_1_10">&#167;3.6.1.10</a>, <a href="4-cdp.html#SP3_6_1_12">&#167;3.6.1.12</a>, <a href="4-cdp.html#SP3_6_1_14">&#167;3.6.1.14</a>, <a href="4-cdp.html#SP3_6_1_16">&#167;3.6.1.16</a>, <a href="4-cdp.html#SP3_6_1_19">&#167;3.6.1.19</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">var</span><span class="plain-syntax">, </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">index_var</span><span class="plain-syntax">,</span>
<span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="function-syntax">DeferredPropositions::compile_loop_header</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">DeferredPropositions::compile_loop_header</span></span>:<br/><a href="4-cdp.html#SP3_6_1_4_3_5">&#167;3.6.1.4.3.5</a>, <a href="4-cdp.html#SP3_6_1_7">&#167;3.6.1.7</a>, <a href="4-cdp.html#SP3_6_1_10">&#167;3.6.1.10</a>, <a href="4-cdp.html#SP3_6_1_12">&#167;3.6.1.12</a>, <a href="4-cdp.html#SP3_6_1_14">&#167;3.6.1.14</a>, <a href="4-cdp.html#SP3_6_1_16">&#167;3.6.1.16</a>, <a href="4-cdp.html#SP3_6_1_19">&#167;3.6.1.19</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">var</span><span class="plain-syntax">, </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">index_var</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">proposition</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">avoid_parent_optimisation</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">grouped</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>

View file

@ -122,14 +122,17 @@ at runtime.
<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#SP3">&#167;3</a>, <a href="4-dtd.html#SP4">&#167;4</a>, <a href="4-dtd.html#SP9">&#167;9</a>, <a href="4-dtd.html#SP10">&#167;10</a>, <a href="4-dtd.html#SP11">&#167;11</a>, <a href="4-dtd.html#SP13">&#167;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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="string-syntax">"deferred proposition (reason %d) for "</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">Propositions::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</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">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="4-cdp.html#SP2" class="function-link"><span class="function-syntax">DeferredPropositions::compilation_agent</span></a><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_pcalc_prop_deferral</span><span class="plain-syntax">(</span><span class="identifier-syntax">pdef</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -92,7 +92,7 @@ enforced; it's fine to store arbitrary data with <span class="extract"><span cla
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::begin</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::begin</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a><br/>Text Literals - <a href="4-tl.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">&#167;1</a><br/>Responses - <a href="4-rsp.html#SP7_3">&#167;7.3</a>, <a href="4-rsp.html#SP7_4">&#167;7.4</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">&#167;2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">&#167;18.1</a><br/>Rules - <a href="5-rls.html#SP8_1_1">&#167;8.1.1</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP9">&#167;9</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a>, <a href="6-tm.html#SP3">&#167;3</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a><br/>Parsing - <a href="8-prs.html#SP2">&#167;2</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::begin</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::begin</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a><br/>Text Literals - <a href="4-tl.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">&#167;1</a><br/>Responses - <a href="4-rsp.html#SP8_3">&#167;8.3</a>, <a href="4-rsp.html#SP8_4">&#167;8.4</a><br/>Box Quotations - <a href="4-bq.html#SP2">&#167;2</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">&#167;18.1</a><br/>Rules - <a href="5-rls.html#SP8_1_1">&#167;8.1.1</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP9">&#167;9</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a>, <a href="6-tm.html#SP3">&#167;3</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a><br/>Parsing - <a href="8-prs.html#SP2">&#167;2</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Packaging::enter_home_of</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP9" class="function-link"><span class="function-syntax">EmitArrays::begin_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax">;</span>
@ -158,7 +158,7 @@ which would be a typesafe list in I7, so they can be absolutely any data,
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::numeric_entry</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::numeric_entry</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a>, <a href="4-ll.html#SP7_1">&#167;7.1</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">&#167;2.1</a><br/>Relation Literals - <a href="4-rl.html#SP1">&#167;1</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">&#167;1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP11">&#167;11</a>, <a href="5-rsfk.html#SP18_1_1_1">&#167;18.1.1.1</a>, <a href="5-rsfk.html#SP18_1_1_2">&#167;18.1.1.2</a>, <a href="5-rsfk.html#SP22">&#167;22</a><br/>Rules - <a href="5-rls.html#SP8_1_1">&#167;8.1.1</a>, <a href="5-rls.html#SP8_1_2">&#167;8.1.2</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP4_1_3">&#167;4.1.3</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP8">&#167;8</a>, <a href="5-rart.html#SP9_2">&#167;9.2</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1_1_3">&#167;4.1.1.1.1.3</a>, <a href="5-rsft.html#SP4_1_1_1_1_4">&#167;4.1.1.1.1.4</a>, <a href="5-rsft.html#SP4_2_3">&#167;4.2.3</a>, <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a><br/>Timed Rules - <a href="6-tr.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a>, <a href="7-act.html#SP2">&#167;2</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::numeric_entry</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::numeric_entry</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a>, <a href="4-ll.html#SP7_1">&#167;7.1</a><br/>Box Quotations - <a href="4-bq.html#SP2">&#167;2</a><br/>Relation Literals - <a href="4-rl.html#SP1">&#167;1</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">&#167;1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP11">&#167;11</a>, <a href="5-rsfk.html#SP18_1_1_1">&#167;18.1.1.1</a>, <a href="5-rsfk.html#SP18_1_1_2">&#167;18.1.1.2</a>, <a href="5-rsfk.html#SP22">&#167;22</a><br/>Rules - <a href="5-rls.html#SP8_1_1">&#167;8.1.1</a>, <a href="5-rls.html#SP8_1_2">&#167;8.1.2</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP4_1_3">&#167;4.1.3</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP8">&#167;8</a>, <a href="5-rart.html#SP9_2">&#167;9.2</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1_1_3">&#167;4.1.1.1.1.3</a>, <a href="5-rsft.html#SP4_1_1_1_1_4">&#167;4.1.1.1.1.4</a>, <a href="5-rsft.html#SP4_2_3">&#167;4.2.3</a>, <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a><br/>Timed Rules - <a href="6-tr.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a>, <a href="7-act.html#SP2">&#167;2</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP10" class="function-link"><span class="function-syntax">EmitArrays::entry_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -175,7 +175,7 @@ which would be a typesafe list in I7, so they can be absolutely any data,
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">NULL_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::text_entry</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::text_entry</span></span>:<br/>Responses - <a href="4-rsp.html#SP6_1">&#167;6.1</a><br/>Relation Literals - <a href="4-rl.html#SP1">&#167;1</a><br/>Rules - <a href="5-rls.html#SP12">&#167;12</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_1">&#167;4.1.1</a>, <a href="5-rart.html#SP4_1_5">&#167;4.1.5</a>, <a href="5-rart.html#SP5">&#167;5</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">content</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::text_entry</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::text_entry</span></span>:<br/>Responses - <a href="4-rsp.html#SP6">&#167;6</a><br/>Relation Literals - <a href="4-rl.html#SP1">&#167;1</a><br/>Rules - <a href="5-rls.html#SP12">&#167;12</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_1">&#167;4.1.1</a>, <a href="5-rart.html#SP4_1_5">&#167;4.1.5</a>, <a href="5-rart.html#SP5">&#167;5</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">content</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::text_value</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), &amp;</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">content</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP10" class="function-link"><span class="function-syntax">EmitArrays::entry_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
@ -213,7 +213,7 @@ difference to compiled code.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::end</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::end</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a><br/>Text Literals - <a href="4-tl.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">&#167;1</a><br/>Responses - <a href="4-rsp.html#SP7_3">&#167;7.3</a>, <a href="4-rsp.html#SP7_4">&#167;7.4</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">&#167;2.1</a><br/>Relation Literals - <a href="4-rl.html#SP1">&#167;1</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">&#167;1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">&#167;18.1</a><br/>Rules - <a href="5-rls.html#SP8_1_5">&#167;8.1.5</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP4_1_2">&#167;4.1.2</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP9">&#167;9</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">&#167;4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1">&#167;4.1.1.1.1</a>, <a href="5-rsft.html#SP4_2">&#167;4.2</a>, <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a>, <a href="6-tm.html#SP3">&#167;3</a><br/>Timed Rules - <a href="6-tr.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a>, <a href="7-act.html#SP2">&#167;2</a><br/>Parsing - <a href="8-prs.html#SP2">&#167;2</a><br/>Command Grammars - <a href="8-cg.html#SP7">&#167;7</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::end</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::end</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">&#167;1</a>, <a href="4-ll.html#SP2">&#167;2</a><br/>Text Literals - <a href="4-tl.html#SP1">&#167;1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">&#167;1</a><br/>Responses - <a href="4-rsp.html#SP8_3">&#167;8.3</a>, <a href="4-rsp.html#SP8_4">&#167;8.4</a><br/>Box Quotations - <a href="4-bq.html#SP2">&#167;2</a><br/>Relation Literals - <a href="4-rl.html#SP1">&#167;1</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">&#167;1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">&#167;18.1</a><br/>Rules - <a href="5-rls.html#SP8_1_5">&#167;8.1.5</a>, <a href="5-rls.html#SP12">&#167;12</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">&#167;4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">&#167;4.1</a>, <a href="5-rart.html#SP4_1_2">&#167;4.1.2</a>, <a href="5-rart.html#SP5">&#167;5</a>, <a href="5-rart.html#SP9">&#167;9</a>, <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">&#167;4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1">&#167;4.1.1.1.1</a>, <a href="5-rsft.html#SP4_2">&#167;4.2</a>, <a href="5-rsft.html#SP4_3">&#167;4.3</a><br/>Chronology - <a href="5-chr.html#SP5">&#167;5</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_2">&#167;2.2</a>, <a href="6-tm.html#SP3">&#167;3</a><br/>Timed Rules - <a href="6-tr.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP1">&#167;1</a>, <a href="7-act.html#SP2">&#167;2</a><br/>Parsing - <a href="8-prs.html#SP2">&#167;2</a><br/>Command Grammars - <a href="8-cg.html#SP7">&#167;7</a><br/>Figures - <a href="9-fgr.html#SP1">&#167;1</a><br/>Sound Effects - <a href="9-se.html#SP1">&#167;1</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a><br/>Test Scripts - <a href="10-ts.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP11" class="function-link"><span class="function-syntax">EmitArrays::end_inner</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Packaging::exit</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

File diff suppressed because one or more lines are too long

View file

@ -331,7 +331,7 @@ it represents an actual number at run-time, the second if not:
</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">Emit::numeric_constant</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Emit::numeric_constant</span></span>:<br/>Fundamental Constants - <a href="3-fc.html#SP2">&#167;2</a><br/>Use Options - <a href="3-uo.html#SP1_1">&#167;1.1</a>, <a href="3-uo.html#SP1_3">&#167;1.3</a><br/>Responses - <a href="4-rsp.html#SP6_1">&#167;6.1</a>, <a href="4-rsp.html#SP7_2">&#167;7.2</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP26">&#167;26</a>, <a href="5-rsfk.html#SP30">&#167;30</a><br/>Rules - <a href="5-rls.html#SP10">&#167;10</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Relations at Run Time - <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Chronology - <a href="5-chr.html#SP7">&#167;7</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_1">&#167;2.1</a><br/>The Score - <a href="6-ts.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP2">&#167;2</a><br/>Command Grammars - <a href="8-cg.html#SP1">&#167;1</a>, <a href="8-cg.html#SP2">&#167;2</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Emit::numeric_constant</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Emit::numeric_constant</span></span>:<br/>Fundamental Constants - <a href="3-fc.html#SP2">&#167;2</a><br/>Use Options - <a href="3-uo.html#SP1_1">&#167;1.1</a>, <a href="3-uo.html#SP1_3">&#167;1.3</a><br/>Responses - <a href="4-rsp.html#SP6">&#167;6</a>, <a href="4-rsp.html#SP8_2">&#167;8.2</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP26">&#167;26</a>, <a href="5-rsfk.html#SP30">&#167;30</a><br/>Rules - <a href="5-rls.html#SP10">&#167;10</a><br/>Activities - <a href="5-act.html#SP2">&#167;2</a><br/>Relations at Run Time - <a href="5-rart.html#SP9_3">&#167;9.3</a><br/>Chronology - <a href="5-chr.html#SP7">&#167;7</a><br/>The Player - <a href="6-tp.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_1">&#167;2.1</a><br/>The Score - <a href="6-ts.html#SP1">&#167;1</a><br/>Actions - <a href="7-act.html#SP2">&#167;2</a><br/>Command Grammars - <a href="8-cg.html#SP1">&#167;1</a>, <a href="8-cg.html#SP2">&#167;2</a><br/>External Files - <a href="9-ef.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-emt.html#SP9" class="function-link"><span class="function-syntax">Emit::numeric_constant_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">, </span><span class="identifier-syntax">int_interk</span><span class="plain-syntax">, </span><span class="identifier-syntax">INVALID_IANN</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -366,7 +366,7 @@ it represents an actual number at run-time, the second if 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">Emit::text_constant</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">Emit::text_constant</span></span>:<br/>Hierarchy - <a href="2-hrr.html#SP23">&#167;23</a><br/>Fundamental Constants - <a href="3-fc.html#SP1_1">&#167;1.1</a>, <a href="3-fc.html#SP1_2">&#167;1.2</a><br/>Text Literals - <a href="4-tl.html#SP4">&#167;4</a><br/>Responses - <a href="4-rsp.html#SP6_1">&#167;6.1</a><br/>Rules - <a href="5-rls.html#SP14">&#167;14</a><br/>Bibliographic Data - <a href="6-bd.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">contents</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Emit::text_constant</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">Emit::text_constant</span></span>:<br/>Hierarchy - <a href="2-hrr.html#SP23">&#167;23</a><br/>Fundamental Constants - <a href="3-fc.html#SP1_1">&#167;1.1</a>, <a href="3-fc.html#SP1_2">&#167;1.2</a><br/>Text Literals - <a href="4-tl.html#SP4">&#167;4</a><br/>Responses - <a href="4-rsp.html#SP6">&#167;6</a><br/>Rules - <a href="5-rls.html#SP14">&#167;14</a><br/>Bibliographic Data - <a href="6-bd.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">contents</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">con_iname</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><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::warehouse</span></a><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::package</span></a><span class="plain-syntax">());</span>
@ -381,7 +381,7 @@ it represents an actual number at run-time, the second if not:
</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">Emit::iname_constant</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">Emit::iname_constant</span></span>:<br/>Responses - <a href="4-rsp.html#SP6_1">&#167;6.1</a><br/>Rules - <a href="5-rls.html#SP2">&#167;2</a>, <a href="5-rls.html#SP8">&#167;8</a>, <a href="5-rls.html#SP14">&#167;14</a><br/>Instance Counting - <a href="5-ic.html#SP9">&#167;9</a><br/>Relations at Run Time - <a href="5-rart.html#SP1">&#167;1</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>Spatial - <a href="6-spt.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_1">&#167;2.1</a><br/>The Score - <a href="6-ts.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val_iname</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Emit::iname_constant</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">Emit::iname_constant</span></span>:<br/>Responses - <a href="4-rsp.html#SP6">&#167;6</a><br/>Rules - <a href="5-rls.html#SP2">&#167;2</a>, <a href="5-rls.html#SP8">&#167;8</a>, <a href="5-rls.html#SP14">&#167;14</a><br/>Instance Counting - <a href="5-ic.html#SP9">&#167;9</a><br/>Relations at Run Time - <a href="5-rart.html#SP1">&#167;1</a><br/>Naming - <a href="6-nmn.html#SP2">&#167;2</a><br/>Spatial - <a href="6-spt.html#SP1">&#167;1</a><br/>The Map - <a href="6-tm.html#SP2_1">&#167;2.1</a><br/>The Score - <a href="6-ts.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</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="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">con_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">con_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Produce::define_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_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">kind_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Produce::kind_to_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>

File diff suppressed because one or more lines are too long

View file

@ -12,6 +12,14 @@
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
@ -93,31 +101,20 @@ existed only to serve the needs of an unusual single work of IF called
<span class="plain-syntax"> </span><span class="string-syntax">"a boxed quotation can't be empty"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"though I suppose you could make it consist of just a few spaces "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"to get a similar effect if you really needed to."</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">desc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="string-syntax">"box quotation '%W'"</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">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="4-bq.html#SP2" class="function-link"><span class="function-syntax">BoxQuotations::compilation_agent</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">STORE_POINTER_box_quotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">bq</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><span class="identifier-syntax">VH</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">bq</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure box_quotation is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The box functions are then compiled in due course by the following coroutine
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The box functions are then compiled in due course by the following agent
(see <a href="../core-module/1-htc.html" class="internal">How To Compile (in core)</a>). The reason they weren't simply compiled earlier
is that a function was already being compiled at the time, and you can't
compile two functions at the same time.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BoxQuotations::compile_support_matter</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">box_quotation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bq</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">problem_count</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">bq</span><span class="plain-syntax">, </span><span class="reserved-syntax">box_quotation</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bq</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_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">bq</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">problem_count</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-bq.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Compile the box function</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>&#167;2.1. </b>The "box function", which displays the quotation, roughly translates to:
<p class="commentary">The "box function", which displays the quotation, roughly translates to:
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -130,10 +127,9 @@ compile two functions at the same time.
tiny array inside the same enclosure as the box function.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the box function</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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BoxQuotations::compilation_agent</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">BoxQuotations::compilation_agent</span></span>:<br/><a href="4-bq.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">box_quotation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bq</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_box_quotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="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">bq</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">seen_flag_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::numeric_entry</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::numeric_entry</span></a><span class="plain-syntax">(0);</span>
@ -170,8 +166,8 @@ tiny array inside the same enclosure as the box function.
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-bq.html#SP2">&#167;2</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-rsp.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-fc.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-enc.html">enc</a></li><li class="progresssection"><a href="4-ll.html">ll</a></li><li class="progresssection"><a href="4-tl.html">tl</a></li><li class="progresssection"><a href="4-ts.html">ts</a></li><li class="progresssection"><a href="4-rsp.html">rsp</a></li><li class="progresscurrent">bq</li><li class="progresssection"><a href="4-rl.html">rl</a></li><li class="progresssection"><a href="4-sal.html">sal</a></li><li class="progresssection"><a href="4-gt.html">gt</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-rl.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -17,6 +17,14 @@
<script src="../docs-assets/Bigfoot.js"></script>
<link href="../docs-assets/Bigfoot.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
@ -135,36 +143,19 @@ following, which returns a text literal to print a listing grouped as asked.
<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">GROUPS_TOGETHER_HAP</span><span class="plain-syntax">, </span><span class="constant-syntax">GROUP_TOGETHER_FN_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gtf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text_value_iname</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">gtf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">printing_fn_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gtf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">articles_bit</span><span class="plain-syntax"> = </span><span class="identifier-syntax">include_articles</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">desc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="string-syntax">"group together '%n'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gtf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">printing_fn_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="4-gt.html#SP3" class="function-link"><span class="function-syntax">GroupTogether::compilation_agent</span></a><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_group_together_function</span><span class="plain-syntax">(</span><span class="identifier-syntax">gtf</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gtf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text_value_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>And here we work through the queue of GTFs waiting to be compiled:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">group_together_function</span><span class="plain-syntax"> *</span><span class="identifier-syntax">latest_gtf_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">GroupTogether::compilation_coroutine</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">group_together_function</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gtf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FIRST_OBJECT</span><span class="plain-syntax">(</span><span class="reserved-syntax">group_together_function</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">latest_gtf_compiled</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gtf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEXT_OBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">latest_gtf_compiled</span><span class="plain-syntax">, </span><span class="reserved-syntax">group_together_function</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gtf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-gt.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Compile the actual GTF</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">latest_gtf_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gtf</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3_1" class="paragraph-anchor"></a><b>&#167;3.1. </b>Again, see the DM4; this all continues to follow Inform 6 conventions.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the actual GTF</span><span class="named-paragraph-number">3.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>Again, see the DM4; this all continues to follow Inform 6 conventions.
</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">GroupTogether::compilation_agent</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">GroupTogether::compilation_agent</span></span>:<br/><a href="4-gt.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">group_together_function</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gtf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_group_together_function</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="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">gtf</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">printing_fn_iname</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>
@ -203,8 +194,8 @@ following, which returns a text literal to print a listing grouped as asked.
<span class="plain-syntax"> </span><a href="2-ec.html#SP11" class="function-link"><span class="function-syntax">EmitCode::rfalse</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-gt.html#SP3">&#167;3</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-sal.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-fc.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-enc.html">enc</a></li><li class="progresssection"><a href="4-ll.html">ll</a></li><li class="progresssection"><a href="4-tl.html">tl</a></li><li class="progresssection"><a href="4-ts.html">ts</a></li><li class="progresssection"><a href="4-rsp.html">rsp</a></li><li class="progresssection"><a href="4-bq.html">bq</a></li><li class="progresssection"><a href="4-rl.html">rl</a></li><li class="progresssection"><a href="4-sal.html">sal</a></li><li class="progresscurrent">gt</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="5-rsfk.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -181,29 +181,27 @@ object, and here we return its value:
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">ListLiterals::large_block_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">literal_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ll</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ll_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ll_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">ll</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ll_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">LIST_LITERAL_HL</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">desc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="string-syntax">"list literal '%W'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">unbraced_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Sequence::queue_at</span><span class="plain-syntax">(&amp;</span><a href="4-ll.html#SP5" class="function-link"><span class="function-syntax">ListLiterals::compilation_agent</span></a><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_literal_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">ll</span><span class="plain-syntax">), </span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">list_text</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">ll</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ll_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>The large blocks are then compiled in due course by the following coroutine
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>The large blocks are then compiled in due course by the following agent
(see <a href="../core-module/1-htc.html" class="internal">How To Compile (in core)</a>):
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ListLiterals::compile_support_matter</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">literal_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ll</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">problem_count</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">ll</span><span class="plain-syntax">, </span><span class="identifier-syntax">literal_list</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">list_compiled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ll_iname</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">list_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</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">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">list_text</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Lists::kind_of_ll</span><span class="plain-syntax">(</span><span class="identifier-syntax">ll</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">problem_count</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-ll.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Compile the large block for this literal</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ListLiterals::compilation_agent</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">ListLiterals::compilation_agent</span></span>:<br/><a href="4-ll.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">literal_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ll</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_literal_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ll_iname</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Lists::kind_of_ll</span><span class="plain-syntax">(</span><span class="identifier-syntax">ll</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">problem_count</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-ll.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Compile the large block for this literal</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>&#167;5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the large block for this literal</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
@ -229,7 +227,7 @@ for the number of instances it has:
</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">ListLiterals::extent_of_instance_list</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">ListLiterals::extent_of_instance_list</span></span>:<br/><a href="4-ll.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ListLiterals::extent_of_instance_list</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">ListLiterals::extent_of_instance_list</span></span>:<br/><a href="4-ll.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="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="named-paragraph-container code-font"><a href="4-ll.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Count entries for an enumeration</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="4-ll.html#SP6_2" class="named-paragraph-link"><span class="named-paragraph">Count entries for a kind of object</span><span class="named-paragraph-number">6.2</span></a></span><span class="plain-syntax">;</span>

View file

@ -72,7 +72,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">runtime</a></li><li><a href="index.html#4">Chapter 4: Enclosed Resources</a></li><li><b>Responses</b></li></ul></div>
<p class="purpose">In this section we keep track of response texts.</p>
<ul class="toc"><li><a href="4-rsp.html#SP1">&#167;1. Introduction</a></li><li><a href="4-rsp.html#SP4">&#167;4. How rules gain responses</a></li><li><a href="4-rsp.html#SP6">&#167;6. Compilation</a></li><li><a href="4-rsp.html#SP7">&#167;7. Synoptic resources</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-rsp.html#SP1">&#167;1. Introduction</a></li><li><a href="4-rsp.html#SP4">&#167;4. How rules gain responses</a></li><li><a href="4-rsp.html#SP6">&#167;6. Compilation</a></li><li><a href="4-rsp.html#SP8">&#167;8. Synoptic resources</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Introduction. </b>Responses are texts &mdash; which may be either literals or text substitutions &mdash;
occurring inside the body of rules, and marked out (A), (B), (C), ... within
@ -126,8 +126,7 @@ stack frame, not in the stack for the "when play begins" rule.
<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">marker_md_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">group_md_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">launcher_compiled</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">via_Inter</span><span class="plain-syntax">; </span><span class="comment-syntax"> if responding to a rule defined by Inter code, not source text</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">via_Inter_routine_compiled</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">via_Inter_routine_compiled</span><span class="plain-syntax">; </span><span class="comment-syntax"> if responding to a rule defined by Inter code</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">response_message</span><span class="plain-syntax">;</span>
</pre>
@ -154,7 +153,6 @@ through a sentence like:
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">the_rule</span><span class="plain-syntax"> = </span><span class="identifier-syntax">R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">the_marker</span><span class="plain-syntax"> = </span><span class="identifier-syntax">marker</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">launcher_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">via_Inter</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">via_Inter_routine_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PR</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP21" class="function-link"><span class="function-syntax">Hierarchy::package_within</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RESPONSES_HAP</span><span class="plain-syntax">, </span><a href="5-rls.html#SP2" class="function-link"><span class="function-syntax">RTRules::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">));</span>
@ -173,6 +171,10 @@ through a sentence like:
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">the_ts</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP5" class="function-link"><span class="function-syntax">TextSubstitutions::new_text_substitution</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-ts.html#SP4" class="function-link"><span class="function-syntax">TextSubstitutions::value_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_ts</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="string-syntax">"response (%c) to '%W'"</span><span class="plain-syntax">, </span><span class="character-syntax">'A'</span><span class="plain-syntax">+</span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="4-rsp.html#SP6" class="function-link"><span class="function-syntax">Responses::compilation_agent</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">STORE_POINTER_response_message</span><span class="plain-syntax">(</span><span class="identifier-syntax">resp</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -184,7 +186,7 @@ through a sentence like:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">value_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Responses::response_constant_iname</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Responses::response_constant_iname</span></span>:<br/><a href="4-rsp.html#SP6_1">&#167;6.1</a></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('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Responses::response_constant_iname</span></span>:<br/><a href="4-rsp.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rules::get_response</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constant_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no response value"</span><span class="plain-syntax">);</span>
@ -239,36 +241,14 @@ to rules defined in Inter kits rather than by source text:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Responses::set_via_translation</span><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">SW</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><a href="4-rsp.html#SP2" class="function-link"><span class="function-syntax">Responses::response_cue</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">, </span><span class="identifier-syntax">SW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">via_Inter</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="string-syntax">"Inter response agent function for '%W'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="4-rsp.html#SP7" class="function-link"><span class="function-syntax">Responses::via_Inter_compilation_agent</span></a><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_response_message</span><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">), </span><span class="identifier-syntax">desc</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Compilation. </b>Values and launchers for responses are then compiled in due course by the
following coroutine (see <a href="../core-module/1-htc.html" class="internal">How To Compile (in core)</a>):
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Responses::compilation_coroutine</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">, </span><span class="reserved-syntax">response_message</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">launcher_compiled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">launcher_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Compile resources needed by this response</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">via_Inter</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">via_Inter_routine_compiled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">r2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">r2</span><span class="plain-syntax">, </span><span class="reserved-syntax">response_message</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax"> == </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">via_Inter_routine_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP6_2" class="named-paragraph-link"><span class="named-paragraph">Compile the response-handler function for this rule</span><span class="named-paragraph-number">6.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>&#167;6.1. </b>Each response compiles to a text value like so:
following agent. Each response compiles to a text value like so:
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -281,10 +261,9 @@ turn runs the "issuing the response text" activity, though it does it via
a function defined in <a href="../BasicInformKit/index.html" class="internal">BasicInformKit</a>.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile resources needed by this response</span><span class="named-paragraph-number">6.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Responses::compilation_agent</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::compilation_agent</span></span>:<br/><a href="4-rsp.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_response_message</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_ts</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts_value_iname</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP4" class="function-link"><span class="function-syntax">TextSubstitutions::value_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rc_iname</span><span class="plain-syntax"> =</span>
@ -317,9 +296,9 @@ a function defined in <a href="../BasicInformKit/index.html" class="internal">Ba
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_2" class="paragraph-anchor"></a><b>&#167;6.2. </b>Something skated over above is that responses can also be created when the
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>Something skated over above is that responses can also be created when the
source text defines a rule only as an Inter routine. For example:
</p>
@ -344,7 +323,19 @@ and note that the response-handler is created in the package for the rule to whi
it responds.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the response-handler function for this rule</span><span class="named-paragraph-number">6.2</span></span><span class="comment-syntax"> =</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Responses::via_Inter_compilation_agent</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">Responses::via_Inter_compilation_agent</span></span>:<br/><a href="4-rsp.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_response_message</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">via_Inter_routine_compiled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">r2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">r2</span><span class="plain-syntax">, </span><span class="reserved-syntax">response_message</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax"> == </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">the_rule</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">r2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">via_Inter_routine_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Compile the response-handler function for this rule</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the response-handler function for this rule</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -492,19 +483,19 @@ it responds.
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Synoptic resources. </b>These are all completed at the linking stage.
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Synoptic resources. </b>These are all completed at the linking stage.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Responses::compile_synoptic_resources</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Compile the PrintResponse routine</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP7_2" class="named-paragraph-link"><span class="named-paragraph">Compile the NO_RESPONSES constant</span><span class="named-paragraph-number">7.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP7_3" class="named-paragraph-link"><span class="named-paragraph">Compile the ResponseDivisions array</span><span class="named-paragraph-number">7.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP7_4" class="named-paragraph-link"><span class="named-paragraph">Compile the ResponseTexts array</span><span class="named-paragraph-number">7.4</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#SP8_1" class="named-paragraph-link"><span class="named-paragraph">Compile the PrintResponse routine</span><span class="named-paragraph-number">8.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#SP8_2" class="named-paragraph-link"><span class="named-paragraph">Compile the NO_RESPONSES constant</span><span class="named-paragraph-number">8.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#SP8_3" class="named-paragraph-link"><span class="named-paragraph">Compile the ResponseDivisions array</span><span class="named-paragraph-number">8.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP8_4" class="named-paragraph-link"><span class="named-paragraph">Compile the ResponseTexts array</span><span class="named-paragraph-number">8.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the PrintResponse routine</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP8_1" class="paragraph-anchor"></a><b>&#167;8.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the PrintResponse routine</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">
@ -519,8 +510,8 @@ it responds.
<span class="plain-syntax"> </span><a href="2-ec.html#SP6" class="function-link"><span class="function-syntax">EmitCode::comment</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"This function is consolidated"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>&#167;7.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the NO_RESPONSES constant</span><span class="named-paragraph-number">7.2</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP8">&#167;8</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8_2" class="paragraph-anchor"></a><b>&#167;8.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the NO_RESPONSES constant</span><span class="named-paragraph-number">8.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -528,8 +519,8 @@ it responds.
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::annotate_i</span><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">SYNOPTIC_IANN</span><span class="plain-syntax">, </span><span class="identifier-syntax">NO_RESPONSES_SYNID</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP9" class="function-link"><span class="function-syntax">Emit::numeric_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_3" class="paragraph-anchor"></a><b>&#167;7.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the ResponseDivisions array</span><span class="named-paragraph-number">7.3</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP8">&#167;8</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8_3" class="paragraph-anchor"></a><b>&#167;8.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the ResponseDivisions array</span><span class="named-paragraph-number">8.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -539,8 +530,8 @@ it responds.
<span class="plain-syntax"> </span><a href="2-ea.html#SP6" class="function-link"><span class="function-syntax">EmitArrays::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP17" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_4" class="paragraph-anchor"></a><b>&#167;7.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the ResponseTexts array</span><span class="named-paragraph-number">7.4</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP8">&#167;8</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8_4" class="paragraph-anchor"></a><b>&#167;8.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the ResponseTexts array</span><span class="named-paragraph-number">8.4</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -550,7 +541,7 @@ it responds.
<span class="plain-syntax"> </span><a href="2-ea.html#SP6" class="function-link"><span class="function-syntax">EmitArrays::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP17" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP7">&#167;7</a>.</li></ul>
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP8">&#167;8</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-ts.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-fc.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-enc.html">enc</a></li><li class="progresssection"><a href="4-ll.html">ll</a></li><li class="progresssection"><a href="4-tl.html">tl</a></li><li class="progresssection"><a href="4-ts.html">ts</a></li><li class="progresscurrent">rsp</li><li class="progresssection"><a href="4-bq.html">bq</a></li><li class="progresssection"><a href="4-rl.html">rl</a></li><li class="progresssection"><a href="4-sal.html">sal</a></li><li class="progresssection"><a href="4-gt.html">gt</a></li><li class="progresschapter"><a href="5-rsfk.html">5</a></li><li class="progresschapter"><a href="6-nmn.html">6</a></li><li class="progresschapter"><a href="7-act.html">7</a></li><li class="progresschapter"><a href="8-prs.html">8</a></li><li class="progresschapter"><a href="9-fgr.html">9</a></li><li class="progresschapter"><a href="10-sc.html">10</a></li><li class="progressnext"><a href="4-bq.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -118,7 +118,7 @@ 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>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TextLiterals::compile_value_to</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">TextLiterals::compile_value_to</span></span>:<br/>Responses - <a href="4-rsp.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">at</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">content</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TextLiterals::compile_value_to</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">TextLiterals::compile_value_to</span></span>:<br/>Responses - <a href="4-rsp.html#SP6">&#167;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">content</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><a href="2-ea.html#SP2" class="function-link"><span class="function-syntax">EmitArrays::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">CONSTANT_PACKED_TEXT_STORAGE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ea.html#SP4" class="function-link"><span class="function-syntax">EmitArrays::iname_entry</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">content</span><span class="plain-syntax">);</span>

View file

@ -247,7 +247,7 @@ case of a response to a rule, since those are never perishable.
<span class="plain-syntax"> function ----------------------&gt; ...</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">TextSubstitutions::value_iname</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">TextSubstitutions::value_iname</span></span>:<br/><a href="4-ts.html#SP2_1">&#167;2.1</a>, <a href="4-ts.html#SP2_2">&#167;2.2</a><br/>Responses - <a href="4-rsp.html#SP2">&#167;2</a>, <a href="4-rsp.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">TextSubstitutions::value_iname</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">TextSubstitutions::value_iname</span></span>:<br/><a href="4-ts.html#SP2_1">&#167;2.1</a>, <a href="4-ts.html#SP2_2">&#167;2.2</a><br/>Responses - <a href="4-rsp.html#SP2">&#167;2</a>, <a href="4-rsp.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_value_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -264,8 +264,6 @@ also when responses are created &mdash; see <a href="4-rsp.html" class="internal
<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">-&gt;</span><span class="element-syntax">unsubstituted_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sentence_using_this</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">using_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
@ -292,53 +290,44 @@ also when responses are created &mdash; see <a href="4-rsp.html" class="internal
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_point</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
<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">-&gt;</span><span class="element-syntax">owning_point</span><span class="plain-syntax"> = </span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">head_of_defn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">at</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="string-syntax">"text substitution '%W'"</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">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="4-ts.html#SP6" class="function-link"><span class="function-syntax">TextSubstitutions::compilation_agent</span></a><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_text_substitution</span><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">), </span><span class="identifier-syntax">desc</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">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">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="SP6" class="paragraph-anchor"></a><b>&#167;6. Compilation. </b>Functions for substitutions are then compiled in due course by the following coroutine
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Compilation. </b>Functions for substitutions are then compiled in due course by the following agent
(see <a href="../core-module/1-htc.html" class="internal">How To Compile (in core)</a>):
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">latest_ts_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">compiling_text_routines_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="comment-syntax"> used for better problem messages</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::compilation_coroutine</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::compilation_agent</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::compilation_agent</span></span>:<br/><a href="4-ts.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_text_substitution</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</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><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>
<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">if</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="identifier-syntax">ts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FIRST_OBJECT</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">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEXT_OBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">latest_ts_compiled</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ts</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">latest_ts_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ts</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tr_done_already</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tr_done_already</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">makes_local_refs</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP7" class="function-link"><span class="function-syntax">TextSubstitutions::compile_function</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-ts.html#SP1" class="function-link"><span class="function-syntax">TextSubstitutions::compile_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_value_iname</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_function_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">makes_local_refs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<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="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><a href="4-ts.html#SP1" class="function-link"><span class="function-syntax">TextSubstitutions::compile_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_value_iname</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ts_function_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">makes_local_refs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">compiling_text_routines_mode</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">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="SP7" class="paragraph-anchor"></a><b>&#167;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 class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>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">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('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">TextSubstitutions::compile_function</span></span>:<br/><a href="4-ts.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::compile_function</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_function</span></span>:<br/><a href="4-ts.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEXT_SUBSTITUTIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Compiling text routine %d %08x %W\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">using_frame</span><span class="plain-syntax">), </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unsubstituted_text</span><span class="plain-syntax">);</span>
@ -462,7 +451,7 @@ local names being used in substitutions, since this often confuses newcomers:
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::append_text_substitution_proviso</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">TextSubstitutions::append_text_substitution_proviso</span></span>:<br/><a href="4-ts.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TextSubstitutions::append_text_substitution_proviso</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::append_text_substitution_proviso</span></span>:<br/><a href="4-ts.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">it_is_not_worth_adding</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">compiling_text_routines_mode</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">current_ts_being_compiled</span><span class="plain-syntax">) &amp;&amp;</span>

View file

@ -132,7 +132,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">shell_routine_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::iname</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">RTRules::iname</span></span>:<br/><a href="5-rls.html#SP4_2">&#167;4.2</a>, <a href="5-rls.html#SP5_2">&#167;5.2</a>, <a href="5-rls.html#SP5_2_1">&#167;5.2.1</a><br/>Responses - <a href="4-rsp.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::iname</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">RTRules::iname</span></span>:<br/><a href="5-rls.html#SP4_2">&#167;4.2</a>, <a href="5-rls.html#SP5_2">&#167;5.2</a>, <a href="5-rls.html#SP5_2_1">&#167;5.2.1</a><br/>Responses - <a href="4-rsp.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">defn_as_I7_source</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">CompileImperativeDefn::iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">defn_as_I7_source</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">rule_extern_iname</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">applicability_constraints</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
@ -153,7 +153,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">xiname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">xiname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::get_handler_definition</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">RTRules::get_handler_definition</span></span>:<br/>Responses - <a href="4-rsp.html#SP6_2">&#167;6.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::get_handler_definition</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">RTRules::get_handler_definition</span></span>:<br/>Responses - <a href="4-rsp.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rule_extern_response_handler_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rule_extern_response_handler_iname</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP15" class="function-link"><span class="function-syntax">Hierarchy::derive_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RESPONDER_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">xiname</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rule_package</span><span class="plain-syntax">);</span>

View file

@ -179,7 +179,7 @@ and in this case we therefore ignore <span class="extract"><span class="extract-
<span class="plain-syntax"> </span><span class="identifier-syntax">I6_var_TS</span><span class="plain-syntax">, </span><span class="identifier-syntax">is_parameter</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">verify_as_kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">adapt_region</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">RTActionPatterns::compile_pattern_match_clause_inner</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">RTActionPatterns::compile_pattern_match_clause_inner</span></span>:<br/>Looping Over Scope - <a href="8-los.html#SP2_1">&#167;2.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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTActionPatterns::compile_pattern_match_clause_inner</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">RTActionPatterns::compile_pattern_match_clause_inner</span></span>:<br/>Looping Over Scope - <a href="8-los.html#SP2">&#167;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="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I6_var_TS</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">is_parameter</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">verify_as_kind</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">adapt_region</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">force_proposition</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>

View file

@ -96,29 +96,15 @@ function togglePopup(material_id) {
<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#SP19" class="function-link"><span class="function-syntax">Hierarchy::local_package</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LOOP_OVER_SCOPES_HAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">los</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">los_iname</span><span class="plain-syntax"> = </span><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">LOOP_OVER_SCOPE_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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="string-syntax">"loop over scope '%W'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">los</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">what_to_find</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="8-los.html#SP2" class="function-link"><span class="function-syntax">LoopingOverScope::compilation_agent</span></a><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_loop_over_scope</span><span class="plain-syntax">(</span><span class="identifier-syntax">los</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">los</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">loop_over_scope</span><span class="plain-syntax"> *</span><span class="identifier-syntax">latest_los</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">LoopingOverScope::compilation_coroutine</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">loop_over_scope</span><span class="plain-syntax"> *</span><span class="identifier-syntax">los</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">latest_los</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">los</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FIRST_OBJECT</span><span class="plain-syntax">(</span><span class="reserved-syntax">loop_over_scope</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">los</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEXT_OBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">latest_los</span><span class="plain-syntax">, </span><span class="reserved-syntax">loop_over_scope</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">los</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">latest_los</span><span class="plain-syntax"> = </span><span class="identifier-syntax">los</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="8-los.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Compile an individual loop-over-scope</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>&#167;2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an individual loop-over-scope</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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LoopingOverScope::compilation_agent</span><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">loop_over_scope</span><span class="plain-syntax"> *</span><span class="identifier-syntax">los</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RETRIEVE_POINTER_loop_over_scope</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="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">los</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">los_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">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>
@ -146,8 +132,8 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Functions::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="8-los.html#SP2">&#167;2</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="8-gpr.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-fc.html">3</a></li><li class="progresschapter"><a href="4-enc.html">4</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="progresscurrentchapter">8</li><li class="progresssection"><a href="8-prs.html">prs</a></li><li class="progresssection"><a href="8-cg.html">cg</a></li><li class="progresssection"><a href="8-cgl.html">cgl</a></li><li class="progresssection"><a href="8-nft.html">nft</a></li><li class="progresssection"><a href="8-tpv.html">tpv</a></li><li class="progresssection"><a href="8-gpr.html">gpr</a></li><li class="progresscurrent">los</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="9-fgr.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -89,7 +89,7 @@ Inform must also work out the kind &mdash; here, it's "list of numbers".
no indication of its kind &mdash; this must be determined from context.
</p>
<p class="commentary">The following Preform grammar handles that:
<p class="commentary">The following Preform grammar handles the syntax, at least:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -98,12 +98,12 @@ no indication of its kind &mdash; this must be determined from context.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">\{</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;list-conts&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">\}</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { -, Lists::at(RP[1], W) }</span>
<span class="Preform-function-syntax">&lt;list-conts&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;list-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;list-conts&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, Lists::add(RP[1], RP[2], W, R[1]) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;list-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, Lists::add(RP[1], Lists::empty_literal(W), W, R[1]) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;list-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;list-conts&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, Lists::add(RP[1], RP[2], W, R[1]) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;list-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, Lists::add(RP[1], Lists::empty_literal(W), W, R[1]) }</span>
<span class="Preform-function-syntax">&lt;list-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;s-value&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { FALSE, RP[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">......</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, Specifications::new_UNKNOWN(W) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;s-value&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { FALSE, RP[1] }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">......</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, Specifications::new_UNKNOWN(W) }</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>And the result of this grammar, if it matches, is an rvalue made thus:
@ -134,9 +134,6 @@ braces and commas balance; and
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ll_package</span><span class="plain-syntax">; </span><span class="comment-syntax"> which will be the enclosure for...</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">ll_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">list_compiled</span><span class="plain-syntax">; </span><span class="comment-syntax"> lists are compiled at several different points: has this one been done?</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">literal_list</span><span class="plain-syntax">;</span>
</pre>
@ -159,10 +156,7 @@ They begin with a call to:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">literal_list</span><span class="plain-syntax"> *</span><span class="function-syntax">Lists::empty_literal</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">Lists::empty_literal</span></span>:<br/><a href="3-ll.html#SP1">&#167;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="reserved-syntax">literal_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ll</span><span class="plain-syntax"> = </span><a href="3-ll.html#SP6" class="function-link"><span class="function-syntax">Lists::find_literal</span></a><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">ll</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">ll</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">literal_list</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">list_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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ll</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">ll</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">literal_list</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unbraced_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">; </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">entry_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_nil</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">listed_within_code</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">ll</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kinds_known_to_be_inconsistent</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>

View file

@ -1,14 +1,14 @@
Total memory consumption was 284259K = 278 MB
Total memory consumption was 284681K = 278 MB
64.1% was used for 1386085 objects, in 311211 frames in 228 x 800K = 182400K = 178 MB:
63.7% was used for 1388304 objects, in 312341 frames in 227 x 800K = 181600K = 177 MB:
9.4% inter_tree_node_array 38 x 8192 = 311296 objects, 27395264 bytes
5.5% text_stream_array 2865 x 100 = 286500 objects, 16135680 bytes
5.4% linked_list 28538 objects, 15981280 bytes
9.3% inter_tree_node_array 38 x 8192 = 311296 objects, 27395264 bytes
5.5% text_stream_array 2876 x 100 = 287600 objects, 16197632 bytes
5.4% linked_list 28535 objects, 15979600 bytes
3.5% parse_node 129367 objects, 10349360 bytes
2.5% verb_conjugation 160 objects, 7425280 bytes
2.5% inter_symbol_array 75 x 1024 = 76800 objects, 7375200 bytes
1.9% parse_node_annotation_array 345 x 500 = 172500 objects, 5531040 bytes
1.8% parse_node_annotation_array 345 x 500 = 172500 objects, 5531040 bytes
1.1% pcalc_prop_array 24 x 1000 = 24000 objects, 3264768 bytes
1.0% map_data 670 objects, 3178480 bytes
0.9% kind_array 66 x 1000 = 66000 objects, 2642112 bytes
@ -33,8 +33,8 @@ Total memory consumption was 284259K = 278 MB
0.2% inter_name_generator_array 19 x 1000 = 19000 objects, 760608 bytes
0.2% unary_predicate_array 16 x 1000 = 16000 objects, 640512 bytes
0.1% local_variable_array 44 x 100 = 4400 objects, 423808 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
---- noun 2379 objects, 285480 bytes
@ -52,6 +52,7 @@ Total memory consumption was 284259K = 278 MB
---- imperative_defn 1376 objects, 99072 bytes
---- anl_entry_array 2 x 1000 = 2000 objects, 96064 bytes
---- noun_usage 2401 objects, 96040 bytes
---- compilation_subtask 1125 objects, 90000 bytes
---- preposition 273 objects, 87360 bytes
---- lexical_cluster 2516 objects, 80512 bytes
---- pcalc_term_array 2 x 1000 = 2000 objects, 80064 bytes
@ -63,8 +64,8 @@ Total memory consumption was 284259K = 278 MB
---- spatial_data 670 objects, 64320 bytes
---- kind_macro_definition 9 objects, 62280 bytes
---- booking 860 objects, 61920 bytes
---- scenes_rcd_data 1880 objects, 60160 bytes
---- actions_rcd_data 1880 objects, 60160 bytes
---- scenes_rcd_data 1880 objects, 60160 bytes
---- command_grammar 130 objects, 58240 bytes
---- pcalc_func_array 1 x 1000 objects, 56032 bytes
---- kind_constructor 77 objects, 55440 bytes
@ -101,15 +102,15 @@ Total memory consumption was 284259K = 278 MB
---- parse_node_tree 20 objects, 17280 bytes
---- method 335 objects, 16080 bytes
---- understanding_reference_array 2 x 100 = 200 objects, 16064 bytes
---- action_name_list_array 1 x 1000 objects, 16032 bytes
---- linked_list_item_array 1 x 1000 objects, 16032 bytes
---- match_avinue_array 1 x 1000 objects, 16032 bytes
---- linked_list_item_array 1 x 1000 objects, 16032 bytes
---- action_name_list_array 1 x 1000 objects, 16032 bytes
---- to_phrase_request 59 objects, 15576 bytes
---- adjective 137 objects, 14248 bytes
---- booking_list 407 objects, 13024 bytes
---- adjective_iname_holder 320 objects, 12800 bytes
---- pathname 292 objects, 11680 bytes
---- stopwatch_timer 140 objects, 11200 bytes
---- stopwatch_timer 137 objects, 10960 bytes
---- filename 208 objects, 8320 bytes
---- equation_node 68 objects, 7616 bytes
---- understanding_item_array 3 x 100 = 300 objects, 7296 bytes
@ -133,34 +134,34 @@ Total memory consumption was 284259K = 278 MB
---- command_line_switch 43 objects, 3440 bytes
---- property_setting_bp_data 84 objects, 3360 bytes
---- method_set 102 objects, 3264 bytes
---- instance_usage_array 1 x 200 objects, 3232 bytes
---- kind_constructor_comparison_schema_array 1 x 100 objects, 3232 bytes
---- definition 44 objects, 3168 bytes
---- instance_usage_array 1 x 200 objects, 3232 bytes
---- compatibility_specification 66 objects, 3168 bytes
---- definition 44 objects, 3168 bytes
---- inform_extension 19 objects, 3040 bytes
---- property_of_value_storage 93 objects, 2976 bytes
---- either_or_property_data 62 objects, 2976 bytes
---- property_of_value_storage 93 objects, 2976 bytes
---- submodule_request 68 objects, 2720 bytes
---- parentage_inference_data 79 objects, 2528 bytes
---- part_of_inference_data 79 objects, 2528 bytes
---- kind_constructor_instance_array 1 x 100 objects, 2432 bytes
---- kind_constructor_casting_rule_array 1 x 100 objects, 2432 bytes
---- equation_symbol 30 objects, 2400 bytes
---- inter_construct 30 objects, 2400 bytes
---- equation_symbol 30 objects, 2400 bytes
---- semver_range 22 objects, 2288 bytes
---- scene 1 object, 2096 bytes
---- use_option 29 objects, 1856 bytes
---- pipeline_step 14 objects, 1680 bytes
---- pronoun_usage 42 objects, 1680 bytes
---- table_contribution_array 1 x 100 objects, 1632 bytes
---- pipeline_step 14 objects, 1680 bytes
---- activity_crossref_array 1 x 100 objects, 1632 bytes
---- table_contribution_array 1 x 100 objects, 1632 bytes
---- plugin 25 objects, 1600 bytes
---- kind_interaction 39 objects, 1560 bytes
---- inter_annotation_form 36 objects, 1440 bytes
---- noun_filter_token 22 objects, 1408 bytes
---- special_meaning_holder 33 objects, 1320 bytes
---- build_script 40 objects, 1280 bytes
---- constant_phrase 20 objects, 1280 bytes
---- build_script 40 objects, 1280 bytes
---- invocation_options_array 1 x 100 objects, 1224 bytes
---- direction_inference_data 30 objects, 1200 bytes
---- quantifier 16 objects, 1024 bytes
@ -236,11 +237,11 @@ Total memory consumption was 284259K = 278 MB
---- parse_name_notice 1 object, 40 bytes
---- kind_template_definition 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.8% text stream storage 46128008 bytes in 294824 claims
16.2% text stream storage 47379692 bytes in 297698 claims
3.4% dictionary storage 10025984 bytes in 17845 claims
---- sorting 968 bytes in 3 claims
---- sorting 944 bytes in 3 claims
2.4% 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
@ -255,5 +256,5 @@ Total memory consumption was 284259K = 278 MB
---- emitter array storage 179456 bytes in 2066 claims
---- code generation workspace for objects 9192 bytes in 9 claims
20.6% was overhead - 60053360 bytes = 58645K = 57 MB
20.2% was overhead - 59084128 bytes = 57699K = 56 MB

View file

@ -1,13 +1,13 @@
100.0% in inform7 run
61.7% in compilation to Inter
25.2% in //ImperativeDefinitions::compile_first_block//
12.1% in //Sequence::compile_function_resources//
5.7% in //InferenceSubjects::emit_all//
62.0% in compilation to Inter
25.3% in //ImperativeDefinitions::compile_first_block//
12.0% in //Sequence::undertake_queued_tasks//
6.0% in //InferenceSubjects::emit_all//
3.6% in //MajorNodes::pre_pass//
3.3% in //MajorNodes::pass_1//
1.9% in //RTRules::RulePrintingRule_routine//
1.9% in //RTRules::rulebooks_array_array//
1.5% in //ImperativeDefinitions::assess_all//
3.2% in //MajorNodes::pass_1//
1.8% in //RTRules::RulePrintingRule_routine//
1.7% in //ImperativeDefinitions::assess_all//
1.7% in //RTRules::rulebooks_array_array//
1.0% in //RTVerbs::ConjugateVerb//
0.5% in //MajorNodes::pass_2//
0.5% in //RTRules::compile_rulebooks//
@ -16,21 +16,22 @@
0.1% in //RTCommandGrammars::compile_all//
0.1% in //RTKinds::compile_data_type_support_routines//
0.1% in //Task::make_built_in_kind_constructors//
2.8% not specifically accounted for
36.0% in running Inter pipeline
11.1% in step preparation
9.3% in inter step 2/14: link
6.7% in inter step 14/14: generate inform6 -> auto.inf
3.8% in inter step 10/14: consolidate-text
0.1% in //World::stages_II_and_III//
2.7% not specifically accounted for
35.8% in running Inter pipeline
11.2% in step preparation
9.1% in inter step 2/14: link
7.0% in inter step 14/14: generate inform6 -> auto.inf
3.7% in inter step 10/14: consolidate-text
0.5% in inter step 9/14: make-identifiers-unique
0.3% in inter step 13/14: eliminate-redundant-operations
0.3% in inter step 6/14: assimilate
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
0.1% in inter step 5/14: resolve-conditional-compilation
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.8% not specifically accounted for
1.9% in supervisor
0.4% not specifically accounted for
2.4% not specifically accounted for
1.8% in supervisor
0.2% not specifically accounted for

View file

@ -11,9 +11,11 @@ of each other or of //core// in any case.
Deep breath, then: the following macros define several hundred functions.
We begin with //core// itself.
@e compilation_subtask_CLASS
@e compile_task_data_CLASS
=
DECLARE_CLASS(compilation_subtask)
DECLARE_CLASS(compile_task_data)
@ //assertions// --

View file

@ -11,6 +11,8 @@ Setting up the use of this module.
Note that the "core" plugin itself does nothihg except to be a parent to the
other two; it doesn't even have an activation function.
@e TASK_QUEUE_DA
=
plugin *core_plugin, *naming_plugin, *counting_plugin;
@ -20,6 +22,8 @@ void CoreModule::start(void) {
naming_plugin = PluginManager::new(&Naming::start, I"naming", core_plugin);
counting_plugin = PluginManager::new(&PL::Counting::start, I"instance counting", core_plugin);
Log::declare_aspect(TASK_QUEUE_DA, L"task queue", FALSE, FALSE);
Writers::register_writer_I('B', &CoreModule::writer);
CorePreform::set_core_internal_NTIs();
CoreSyntax::declare_annotations();

View file

@ -32,9 +32,12 @@ We group the steps into departments, which are in order of when they work:
then the sequence itself.
=
text_stream *current_sequence_bench = NULL;
int Sequence::carry_out(int debugging) {
stopwatch_timer *sequence_timer =
Time::start_stopwatch(inform7_timer, I"compilation to Inter");
current_sequence_bench = Str::new();
@<Divide into compilation units@>;
@<Build a rudimentary set of kinds, relations, verbs and inference subjects@>;
@<Pass three times through the major nodes@>;
@ -48,7 +51,7 @@ int Sequence::carry_out(int debugging) {
@<Generate inter, part 4@>
@<Generate inter, part 5@>
@<Generate index and bibliographic file@>;
if (problem_count == 0) Sequence::throw_error_if_subtasks_remain();
Task::advance_stage_to(FINISHED_CSEQ, I"Ccmplete", -1, debugging, sequence_timer);
int cpu_time_used = Time::stop_stopwatch(sequence_timer);
LOG("Compile CPU time: %d centiseconds\n", cpu_time_used);
@ -81,6 +84,8 @@ as possible.
Str::put_at(name, i, ':'); Str::put_at(name, i+1, ':');
}
stopwatch_timer *st = Time::start_stopwatch(sequence_timer, name);
Str::clear(current_sequence_bench);
WRITE_TO(current_sequence_bench, "%S", name);
DISCARD_TEXT(name)
routine();
int cs = Time::stop_stopwatch(st);
@ -214,15 +219,14 @@ so on. Those absolute basics are made here.
@<Generate inter, part 3@> =
Task::advance_stage_to(INTER3_CSEQ, I"Generating inter (3)",
-1, debugging, sequence_timer);
BENCH(Sequence::compile_literal_resources)
BENCH(PhraseRequests::invoke_to_begin)
BENCH(Closures::compile_closures)
BENCH(Sequence::compile_function_resources)
BENCH(Sequence::undertake_queued_tasks)
BENCH(Responses::compile_synoptic_resources)
BENCH(Sequence::compile_literal_resources)
BENCH(RTRelations::compile_defined_relations)
BENCH(Sequence::compile_function_resources)
BENCH(Sequence::allow_no_further_function_resources)
BENCH(RTMeasurements::compile_test_functions)
BENCH(Sequence::undertake_queued_tasks)
BENCH(Sequence::allow_no_further_queued_tasks)
@<Generate inter, part 4@> =
Task::advance_stage_to(INTER4_CSEQ, I"Generating inter (4)",
@ -233,8 +237,6 @@ so on. Those absolute basics are made here.
@<Generate inter, part 5@> =
Task::advance_stage_to(INTER5_CSEQ, I"Generating inter (5)",
-1, debugging, sequence_timer);
BENCH(RTMeasurements::compile_test_functions)
BENCH(Sequence::compile_literal_resources)
BENCH(RTKinds::compile_heap_allocator)
BENCH(RTKinds::compile_structures)
BENCH(Rules::check_response_usages)
@ -275,78 +277,178 @@ between 5 and 10] pounds" to be compiled, and that in turn creates a further
function compilation in order to provide a context for execution of the phrase
"a random number between 5 and 10", which in turn... and so on.
The only way to be sure of handling all needs here is to keep on compiling
until the process exhausts itself, and this we do. The process is structured
as a set of coroutines[1] which each carry out as much as they can of the work
which has arisen since they were last called, then return how much they did.
Each may indirectly create work for the others, so we repeat until they are
all happy.
@ The only way to be sure of handling all needs here is to keep on compiling
until the process exhausts itself, and this we do with a queue of tasks to
perform.[1] Suppose we have this queue:
= (text)
T1 -> T2 -> T3 -> T4 -> ...
=
and we are working on T2. That uncovers the need for three further tasks
X1, X2, X3: those are added immediately after T2 --
= (text)
T1 -> T2 -> X1 -> X2 -> X3 -> T3 -> T4 -> ...
=
Thus we never reach T3 until T2 has been completely exhausted, including its
secondary tasks. To get a sense of how this works in practice, try:
= (text)
Include task queue in the debugging log.
=
The result terminates since eventually every "To..." phrase definition will
have been compiled with every possible interpretation of its kinds. After that,
everything fizzles out quickly, because none of the other resources here are
able to create new work for each other. The safety cutout in this function is
just defensive programming, and has never been activated. Typically only
one or two iterations are needed in practical cases.
[1] Until 2021 this process is structured as a set of coroutines rather than a
queue. C does not strictly speaking support coroutines, though that hasn't stopped
hackers from using assembly language to manipulate return addresses on the C call
stack, and/or use
//Duff's device -> https://en.wikipedia.org/wiki/Duff%27s_device//. It never
quite came to that here, but it was sometimes difficult to reason about.
[1] C does not support coroutines, though that hasn't stopped hackers from using
assembly language to manipulate return addresses on the C call stack, and/or use
//Duff's device -> https://en.wikipedia.org/wiki/Duff%27s_device//. We avoid
all that by using regular C functions which merely imitate coroutines by
cooperatively giving way to each other. They |return| to the central organising
function //Sequence::compile_function_resources//, not directly into each
other's bodies. But I think the term "coroutine" is reasonable just the same.
@ A task is abstracted as being a call to a function, called the "agent", with
a pointer to the relevant data.
=
void Sequence::compile_function_resources(void) {
int repeat = TRUE, iterations = 0;
while (repeat) {
repeat = FALSE; iterations++;
typedef struct compilation_subtask {
struct compilation_subtask *caused_by;
struct compilation_subtask *next_task;
void (*agent)(struct compilation_subtask *);
struct general_pointer data;
struct parse_node *current_sentence_when_queued;
struct text_stream *description;
CLASS_DEFINITION
} compilation_subtask;
if (PhraseRequests::compilation_coroutine() > 0) repeat = TRUE;
if (GroupTogether::compilation_coroutine() > 0) repeat = TRUE;
if (LoopingOverScope::compilation_coroutine() > 0) repeat = TRUE;
if (Responses::compilation_coroutine() > 0) repeat = TRUE;
if (TextSubstitutions::compilation_coroutine() > 0) repeat = TRUE;
if (DeferredPropositions::compilation_coroutine() > 0) repeat = TRUE;
compilation_subtask *Sequence::new_subtask(void (*agent)(struct compilation_subtask *),
general_pointer gp, text_stream *desc) {
compilation_subtask *t = CREATE(compilation_subtask);
t->caused_by = NULL;
t->next_task = NULL;
t->agent = agent;
t->data = gp;
t->current_sentence_when_queued = current_sentence;
t->description = desc;
return t;
}
if ((problem_count > 0) && (iterations > 10)) repeat = FALSE;
@ Each call to //Sequence::undertake_queued_tasks// works methodically through
the queue until everything is done.
The queue is a linked list of |compilation_subtask| objects in between |first_task|
and |last_task|. (The queue is empty if and only if both are |NULL|.) The queue
only grows, and never has items removed.
A marker called |last_task_undetaken| shows how much progress we have made in
completing the tasks queued: so, when this is equal to |last_task|, there is
nothing to do. Another marker called |current_task| is set only when a task
is under way, and is |NULL| at all other times.
=
compilation_subtask *first_task = NULL, *last_task = NULL, *last_task_undetaken = NULL;
compilation_subtask *current_task = NULL, *current_horizon = NULL;
int task_queue_is_closed = FALSE;
@ The rest of Inform, if it wants to schedule a compilation task, should call
one of these two functions:
=
void Sequence::queue(void (*agent)(struct compilation_subtask *),
general_pointer gp, text_stream *desc) {
compilation_subtask *t = Sequence::new_subtask(agent, gp, desc);
@<Queue the task@>;
}
void Sequence::queue_at(void (*agent)(struct compilation_subtask *),
general_pointer gp, text_stream *desc, parse_node *at) {
compilation_subtask *t = Sequence::new_subtask(agent, gp, desc);
t->current_sentence_when_queued = at;
@<Queue the task@>;
}
@ New entries are inserted in the queue at two write positions:
(*) after the |last_task|, i.e., at the back, if no task is currently going on; or
(*) after the |current_horizon| marker, i.e., after the current task finishes.
@<Queue the task@> =
t->caused_by = current_task;
if (first_task == NULL) { first_task = t; last_task = t; return; }
if (current_horizon) {
t->next_task = current_horizon->next_task;
current_horizon->next_task = t;
current_horizon = t;
} else {
t->next_task = NULL;
last_task->next_task = t;
last_task = t;
}
iterations--; /* since the final round is one where everyone does nothing */
if (iterations > 0)
LOG(".... Sequence::compile_function_resources completed in %d iteration%s\n",
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:
=
void Sequence::compile_literal_resources(void) {
int repeat = TRUE, iterations = 0;
while (repeat) {
repeat = FALSE; iterations++;
if (ListLiterals::compile_support_matter() > 0) repeat = TRUE;
if (BoxQuotations::compile_support_matter() > 0) repeat = TRUE;
if ((problem_count > 0) && (iterations > 10)) repeat = FALSE;
if (t->caused_by) WRITE_TO(t->description, " from [%d]", t->caused_by->allocation_id);
else WRITE_TO(t->description, " from %S", current_sequence_bench);
if (task_queue_is_closed) {
LOG("offending task was: ");
Sequence::write_task(DL, t);
internal_error("too late to schedule further compilation tasks");
}
iterations--; /* since the final round is one where everyone does nothing */
if (iterations > 0)
LOG(".... Sequence::compile_literal_resources completed in %d iteration%s\n",
iterations, (iterations == 1)?"":"s");
if (Log::aspect_switched_on(TASK_QUEUE_DA)) {
LOG("queued: ");
Sequence::write_task(DL, t);
}
@ Here the chimes of midnight sound:
=
void Sequence::allow_no_further_queued_tasks(void) {
task_queue_is_closed = TRUE;
}
@ So here is where the work is done, and the |last_task_undetaken| advances:
=
void Sequence::undertake_queued_tasks(void) {
compilation_subtask *t;
do {
t = first_task;
if (last_task_undetaken) t = last_task_undetaken->next_task;
if (t) {
last_task_undetaken = t;
compilation_subtask *save_task = current_task;
compilation_subtask *save_horizon = current_horizon;
parse_node *save = current_sentence;
current_task = t;
current_horizon = t;
current_sentence = t->current_sentence_when_queued;
(*(t->agent))(t);
if (Log::aspect_switched_on(TASK_QUEUE_DA)) {
LOG("completed: ");
Sequence::write_task(DL, t);
}
current_sentence = save;
current_task = save_task;
current_horizon = save_horizon;
current_sentence = save;
}
} while (t);
}
@ At the end of compilation, the queue ought to be empty, but just in case:
=
void Sequence::throw_error_if_subtasks_remain(void) {
if (first_task) {
compilation_subtask *t = first_task;
if (last_task_undetaken) t = last_task_undetaken->next_task;
if (t) {
Sequence::write_from(DL, t);
internal_error("there are compilation tasks never reached");
}
}
}
@ And these are used for logging:
=
void Sequence::write_from(OUTPUT_STREAM, compilation_subtask *t) {
while (t) {
Sequence::write_task(OUT, t);
t = t->next_task;
}
}
void Sequence::write_task(OUTPUT_STREAM, compilation_subtask *t) {
WRITE("[%d] %S\n", t->allocation_id, t->description);
}

View file

@ -140,6 +140,11 @@ list is a list of. The result would be:
package_request *P = Hierarchy::package_within(REQUESTS_HAP,
CompileImperativeDefn::requests_package(idb));
req->req_iname = Hierarchy::make_iname_in(PHRASE_FN_HL, P);
text_stream *desc = Str::new();
WRITE_TO(desc, "phrase request (%u) for '%W'",
K, Node::get_text(req->compile_from->head_of_defn->at));
Sequence::queue(&PhraseRequests::compilation_agent,
STORE_POINTER_to_phrase_request(req), desc);
return req;
@ Two access functions:
@ -155,27 +160,16 @@ kind **PhraseRequests::kind_variables_for_request(to_phrase_request *req) {
return req->kv_interpretation;
}
@ The following coroutine acts on any pending requests for phrase compilation
since the last time it was called: see //core: How To Compile//.
@ The following agent acts on a pending requests for phrase compilation: see
//core: How To Compile//.
=
to_phrase_request *latest_request_granted = NULL;
int PhraseRequests::compilation_coroutine(void) {
int N = 0;
while (TRUE) {
to_phrase_request *req;
if (latest_request_granted == NULL) req = FIRST_OBJECT(to_phrase_request);
else req = NEXT_OBJECT(latest_request_granted, to_phrase_request);
if (req == NULL) break;
latest_request_granted = req;
CompileImperativeDefn::go(req->compile_from, NULL, req, NULL);
CompileImperativeDefn::advance_progress_bar(req->compile_from,
&total_phrases_compiled, total_phrases_to_compile);
req->compile_from->compilation_data.at_least_one_compiled_form_needed = FALSE;
N++;
}
return N;
void PhraseRequests::compilation_agent(compilation_subtask *task) {
to_phrase_request *req = RETRIEVE_POINTER_to_phrase_request(task->data);
CompileImperativeDefn::go(req->compile_from, NULL, req, NULL);
CompileImperativeDefn::advance_progress_bar(req->compile_from,
&total_phrases_compiled, total_phrases_to_compile);
req->compile_from->compilation_data.at_least_one_compiled_form_needed = FALSE;
}
@ In Basic Inform, only, execution begins at the "To..." phrase "To begin", and

View file

@ -34,28 +34,17 @@ void DeferredPropositions::compile_comment_about_deferral_reason(int reason) {
@h Preliminaries.
Propositions are deferred for diverse reasons: see //Deciding to Defer//. Here
we take our medicine, and actually compile those deferred propositions into
functions. This is part of the phrase-compilation-coroutine process because
funny things can happen when we compile: we can create new text substitutions
which create routines which... and so on. (See //core: How To Compile//.)
functions. This has to be done by an agent because funny things can happen
when we compile: we can create new text substitutions which create routines
which... and so on. (See //core: How To Compile//.)
=
pcalc_prop_deferral *latest_pcd = NULL;
int DeferredPropositions::compilation_coroutine(void) {
int N = 0;
while (TRUE) {
pcalc_prop_deferral *pdef;
if (latest_pcd == NULL)
pdef = FIRST_OBJECT(pcalc_prop_deferral);
else pdef = NEXT_OBJECT(latest_pcd, pcalc_prop_deferral);
if (pdef == NULL) break;
latest_pcd = pdef;
pcalc_prop_deferral *save_current_pdef = current_pdef;
current_pdef = pdef;
DeferredPropositions::compile(pdef);
current_pdef = save_current_pdef;
N++;
}
return N;
void DeferredPropositions::compilation_agent(compilation_subtask *t) {
pcalc_prop_deferral *pdef = RETRIEVE_POINTER_pcalc_prop_deferral(t->data);
pcalc_prop_deferral *save_current_pdef = current_pdef;
current_pdef = pdef;
DeferredPropositions::compile(pdef);
current_pdef = save_current_pdef;
}
@ The basic structure of a proposition function is the same for all of the

View file

@ -38,14 +38,17 @@ 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);
text_stream *desc = Str::new();
WRITE_TO(desc, "deferred proposition (reason %d) for ", reason);
Propositions::write(desc, prop);
Sequence::queue(&DeferredPropositions::compilation_agent,
STORE_POINTER_pcalc_prop_deferral(pdef), desc);
return pdef;
}

View file

@ -30,29 +30,18 @@ void BoxQuotations::new(value_holster *VH, wording W) {
"a boxed quotation can't be empty",
"though I suppose you could make it consist of just a few spaces "
"to get a similar effect if you really needed to.");
text_stream *desc = Str::new();
WRITE_TO(desc, "box quotation '%W'", W);
Sequence::queue(&BoxQuotations::compilation_agent, STORE_POINTER_box_quotation(bq), desc);
if (VH) Emit::holster_iname(VH, bq->function_iname);
}
@ The box functions are then compiled in due course by the following coroutine
@ The box functions are then compiled in due course by the following agent
(see //core: How To Compile//). The reason they weren't simply compiled earlier
is that a function was already being compiled at the time, and you can't
compile two functions at the same time.
=
int BoxQuotations::compile_support_matter(void) {
int N = 0;
box_quotation *bq;
if (problem_count == 0)
LOOP_OVER(bq, box_quotation)
if (bq->function_compiled == FALSE) {
bq->function_compiled = TRUE; N++;
if (problem_count == 0) @<Compile the box function@>;
}
return N;
}
@ The "box function", which displays the quotation, roughly translates to:
The "box function", which displays the quotation, roughly translates to:
= (text)
if (flag == false) {
flag = true;
@ -62,7 +51,9 @@ int BoxQuotations::compile_support_matter(void) {
and ensures that the quotation displays only once. The flag is stored as a
tiny array inside the same enclosure as the box function.
@<Compile the box function@> =
=
void BoxQuotations::compilation_agent(compilation_subtask *t) {
box_quotation *bq = RETRIEVE_POINTER_box_quotation(t->data);
packaging_state save = EmitArrays::begin(bq->seen_flag_iname, K_number);
EmitArrays::numeric_entry(0);
EmitArrays::numeric_entry(0);
@ -99,3 +90,4 @@ tiny array inside the same enclosure as the box function.
EmitCode::up();
Functions::end(save);
}

View file

@ -58,31 +58,18 @@ inter_name *GroupTogether::new(int include_articles) {
Enclosures::new_iname(GROUPS_TOGETHER_HAP, GROUP_TOGETHER_FN_HL);
gtf->text_value_iname = TextLiterals::small_block(gtf->printing_fn_iname);
gtf->articles_bit = include_articles;
text_stream *desc = Str::new();
WRITE_TO(desc, "group together '%n'", gtf->printing_fn_iname);
Sequence::queue(&GroupTogether::compilation_agent,
STORE_POINTER_group_together_function(gtf), desc);
return gtf->text_value_iname;
}
@ And here we work through the queue of GTFs waiting to be compiled:
=
group_together_function *latest_gtf_compiled = NULL;
int GroupTogether::compilation_coroutine(void) {
int N = 0;
while (TRUE) {
group_together_function *gtf = FIRST_OBJECT(group_together_function);
if (latest_gtf_compiled)
gtf = NEXT_OBJECT(latest_gtf_compiled, group_together_function);
if (gtf == NULL) break;
@<Compile the actual GTF@>;
latest_gtf_compiled = gtf;
N++;
}
return N;
}
@ Again, see the DM4; this all continues to follow Inform 6 conventions.
@<Compile the actual GTF@> =
=
void GroupTogether::compilation_agent(compilation_subtask *t) {
group_together_function *gtf = RETRIEVE_POINTER_group_together_function(t->data);
packaging_state save = Functions::begin(gtf->printing_fn_iname);
EmitCode::inv(IF_BIP);
EmitCode::down();
@ -121,3 +108,4 @@ int GroupTogether::compilation_coroutine(void) {
EmitCode::rfalse();
Functions::end(save);
}

View file

@ -97,28 +97,26 @@ inter_name *ListLiterals::compile_literal_list(literal_list *ll) {
}
inter_name *ListLiterals::large_block_iname(literal_list *ll) {
if (ll->ll_iname == NULL)
if (ll->ll_iname == NULL) {
ll->ll_iname = Enclosures::new_iname(LITERALS_HAP, LIST_LITERAL_HL);
text_stream *desc = Str::new();
WRITE_TO(desc, "list literal '%W'", ll->unbraced_text);
Sequence::queue_at(&ListLiterals::compilation_agent,
STORE_POINTER_literal_list(ll), desc, ll->list_text);
}
return ll->ll_iname;
}
@ The large blocks are then compiled in due course by the following coroutine
@ The large blocks are then compiled in due course by the following agent
(see //core: How To Compile//):
=
int ListLiterals::compile_support_matter(void) {
int N = 0;
literal_list *ll;
if (problem_count == 0)
LOOP_OVER(ll, literal_list)
if ((ll->list_compiled == FALSE) && (ll->ll_iname)) {
ll->list_compiled = TRUE; N++;
current_sentence = ll->list_text;
Lists::kind_of_ll(ll, TRUE);
if (problem_count == 0) @<Compile the large block for this literal@>;
}
return N;
void ListLiterals::compilation_agent(compilation_subtask *t) {
literal_list *ll = RETRIEVE_POINTER_literal_list(t->data);
if (ll->ll_iname) {
Lists::kind_of_ll(ll, TRUE);
if (problem_count == 0) @<Compile the large block for this literal@>;
}
}
@<Compile the large block for this literal@> =

View file

@ -48,8 +48,7 @@ typedef struct response_message {
struct inter_name *marker_md_iname;
struct inter_name *group_md_iname;
int launcher_compiled;
int via_Inter; /* if responding to a rule defined by Inter code, not source text */
int via_Inter_routine_compiled;
int via_Inter_routine_compiled; /* if responding to a rule defined by Inter code */
CLASS_DEFINITION
} response_message;
@ -71,7 +70,6 @@ response_message *Responses::response_cue(rule *R, int marker, wording W, stack_
resp->the_rule = R;
resp->the_marker = marker;
resp->launcher_compiled = FALSE;
resp->via_Inter = FALSE;
resp->via_Inter_routine_compiled = FALSE;
package_request *PR = Hierarchy::package_within(RESPONSES_HAP, RTRules::package(R));
@ -90,6 +88,10 @@ response_message *Responses::response_cue(rule *R, int marker, wording W, stack_
resp->the_ts = TextSubstitutions::new_text_substitution(W, frame, R, marker);
TextSubstitutions::value_iname(resp->the_ts);
text_stream *desc = Str::new();
WRITE_TO(desc, "response (%c) to '%W'", 'A'+marker, R->name);
Sequence::queue(&Responses::compilation_agent, STORE_POINTER_response_message(resp), desc);
return resp;
}
@ -149,36 +151,15 @@ Which causes the following to be called:
=
void Responses::set_via_translation(rule *R, int marker, wording SW) {
response_message *resp = Responses::response_cue(R, marker, SW, NULL);
resp->via_Inter = TRUE;
text_stream *desc = Str::new();
WRITE_TO(desc, "Inter response agent function for '%W'", R->name);
Sequence::queue(&Responses::via_Inter_compilation_agent,
STORE_POINTER_response_message(resp), desc);
}
@h Compilation.
Values and launchers for responses are then compiled in due course by the
following coroutine (see //core: How To Compile//):
=
int Responses::compilation_coroutine(void) {
int N = 0;
response_message *resp;
LOOP_OVER(resp, response_message) {
if (resp->launcher_compiled == FALSE) {
resp->launcher_compiled = TRUE;
N++;
@<Compile resources needed by this response@>;
}
if ((resp->via_Inter) && (resp->via_Inter_routine_compiled == FALSE)) {
response_message *r2;
LOOP_OVER(r2, response_message)
if (r2->the_rule == resp->the_rule)
r2->via_Inter_routine_compiled = TRUE;
N++;
@<Compile the response-handler function for this rule@>;
}
}
return N;
}
@ Each response compiles to a text value like so:
following agent. Each response compiles to a text value like so:
= (text)
small block:
value ----------------> CONSTANT_PACKED_TEXT_STORAGE
@ -188,7 +169,9 @@ Thus, printing this value at runtime calls the launcher function. This in
turn runs the "issuing the response text" activity, though it does it via
a function defined in //BasicInformKit//.
@<Compile resources needed by this response@> =
=
void Responses::compilation_agent(compilation_subtask *t) {
response_message *resp = RETRIEVE_POINTER_response_message(t->data);
text_substitution *ts = resp->the_ts;
inter_name *ts_value_iname = TextSubstitutions::value_iname(ts);
inter_name *rc_iname =
@ -221,6 +204,7 @@ a function defined in //BasicInformKit//.
EmitCode::up();
Functions::end(save);
}
@ Something skated over above is that responses can also be created when the
source text defines a rule only as an Inter routine. For example:
@ -240,6 +224,18 @@ to return the current text of (A) without printing it. Speed is not of the essen
and note that the response-handler is created in the package for the rule to which
it responds.
=
void Responses::via_Inter_compilation_agent(compilation_subtask *t) {
response_message *resp = RETRIEVE_POINTER_response_message(t->data);
if (resp->via_Inter_routine_compiled == FALSE) {
response_message *r2;
LOOP_OVER(r2, response_message)
if (r2->the_rule == resp->the_rule)
r2->via_Inter_routine_compiled = TRUE;
@<Compile the response-handler function for this rule@>;
}
}
@<Compile the response-handler function for this rule@> =
inter_name *responder_iname = RTRules::get_handler_definition(resp->the_rule);
packaging_state save = Functions::begin(responder_iname);

View file

@ -162,8 +162,6 @@ 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;
ts->using_frame = NULL;
@ -190,48 +188,39 @@ text_substitution *TextSubstitutions::new_text_substitution(wording W,
ts->owning_point = current_sentence;
id_body *idb = Functions::defn_being_compiled();
if (idb) ts->owning_point = idb->head_of_defn->at;
text_stream *desc = Str::new();
WRITE_TO(desc, "text substitution '%W'", W);
Sequence::queue(&TextSubstitutions::compilation_agent,
STORE_POINTER_text_substitution(ts), desc);
LOGIF(TEXT_SUBSTITUTIONS, "Requesting text routine %d %08x %W %08x\n",
ts->allocation_id, (int) frame, W, R);
return ts;
}
@h Compilation.
Functions for substitutions are then compiled in due course by the following coroutine
Functions for substitutions are then compiled in due course by the following agent
(see //core: How To Compile//):
=
text_substitution *latest_ts_compiled = NULL;
int compiling_text_routines_mode = FALSE; /* used for better problem messages */
int TextSubstitutions::compilation_coroutine(void) {
int N = 0;
void TextSubstitutions::compilation_agent(compilation_subtask *t) {
text_substitution *ts = RETRIEVE_POINTER_text_substitution(t->data);
int save = compiling_text_routines_mode;
compiling_text_routines_mode = TRUE;
while (TRUE) {
text_substitution *ts;
if (latest_ts_compiled == NULL) ts = FIRST_OBJECT(text_substitution);
else ts = NEXT_OBJECT(latest_ts_compiled, text_substitution);
if (ts == NULL) break;
latest_ts_compiled = ts;
if (ts->tr_done_already == FALSE) {
ts->tr_done_already = TRUE;
int makes_local_refs = TextSubstitutions::compile_function(ts);
TextSubstitutions::compile_value(ts->ts_value_iname,
ts->ts_function_iname, makes_local_refs);
}
N++;
}
compiling_text_routines_mode = FALSE;
return N;
int makes_local_refs = TextSubstitutions::compile_function(ts);
TextSubstitutions::compile_value(ts->ts_value_iname,
ts->ts_function_iname, makes_local_refs);
compiling_text_routines_mode = save;
}
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.
@ 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.
=
text_substitution *current_ts_being_compiled = NULL;

View file

@ -23,26 +23,15 @@ loop_over_scope *LoopingOverScope::new(parse_node *what) {
}
package_request *PR = Hierarchy::local_package(LOOP_OVER_SCOPES_HAP);
los->los_iname = Hierarchy::make_iname_in(LOOP_OVER_SCOPE_FN_HL, PR);
text_stream *desc = Str::new();
WRITE_TO(desc, "loop over scope '%W'", Node::get_text(los->what_to_find));
Sequence::queue(&LoopingOverScope::compilation_agent,
STORE_POINTER_loop_over_scope(los), desc);
return los;
}
loop_over_scope *latest_los = NULL;
int LoopingOverScope::compilation_coroutine(void) {
int N = 0;
while (TRUE) {
loop_over_scope *los;
if (latest_los == NULL)
los = FIRST_OBJECT(loop_over_scope);
else los = NEXT_OBJECT(latest_los, loop_over_scope);
if (los == NULL) break;
latest_los = los;
@<Compile an individual loop-over-scope@>;
N++;
}
return N;
}
@<Compile an individual loop-over-scope@> =
void LoopingOverScope::compilation_agent(compilation_subtask *t) {
loop_over_scope *los = RETRIEVE_POINTER_loop_over_scope(t->data);
packaging_state save = Functions::begin(los->los_iname);
stack_frame *phsf = Frames::current_stack_frame();
@ -70,3 +59,4 @@ int LoopingOverScope::compilation_coroutine(void) {
EmitCode::up();
EmitCode::up();
Functions::end(save);
}

View file

@ -13,7 +13,7 @@ Inform must also work out the kind -- here, it's "list of numbers".
Note that the empty list "{}" is valid as a constant, but that it contains
no indication of its kind -- this must be determined from context.
The following Preform grammar handles that:
The following Preform grammar handles the syntax, at least:
=
<s-literal-list> ::=
@ -21,12 +21,12 @@ The following Preform grammar handles that:
\{ <list-conts> \} ==> { -, Lists::at(RP[1], W) }
<list-conts> ::=
<list-entry> , <list-conts> | ==> { 0, Lists::add(RP[1], RP[2], W, R[1]) }
<list-entry> ==> { 0, Lists::add(RP[1], Lists::empty_literal(W), W, R[1]) }
<list-entry> , <list-conts> | ==> { 0, Lists::add(RP[1], RP[2], W, R[1]) }
<list-entry> ==> { 0, Lists::add(RP[1], Lists::empty_literal(W), W, R[1]) }
<list-entry> ::=
<s-value> | ==> { FALSE, RP[1] }
...... ==> { TRUE, Specifications::new_UNKNOWN(W) }
<s-value> | ==> { FALSE, RP[1] }
...... ==> { TRUE, Specifications::new_UNKNOWN(W) }
@ And the result of this grammar, if it matches, is an rvalue made thus:
@ -53,9 +53,6 @@ typedef struct literal_list {
struct package_request *ll_package; /* which will be the enclosure for... */
struct inter_name *ll_iname;
int list_compiled; /* lists are compiled at several different points: has this one been done? */
CLASS_DEFINITION
} literal_list;
@ -74,10 +71,7 @@ They begin with a call to:
=
literal_list *Lists::empty_literal(wording W) {
literal_list *ll = Lists::find_literal(Wordings::first_wn(W));
if (ll == NULL) {
ll = CREATE(literal_list);
ll->list_compiled = FALSE;
}
if (ll == NULL) ll = CREATE(literal_list);
ll->unbraced_text = W; ll->entry_kind = K_nil;
ll->listed_within_code = FALSE;
ll->kinds_known_to_be_inconsistent = FALSE;