mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 16:44:21 +03:00
Replaced coroutine compilation system with a task queue
This commit is contained in:
parent
ec8f68e4ea
commit
4fdc63a2ec
|
@ -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">(&</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">(&</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">, &</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>
|
||||
|
|
|
@ -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>§2. </b><a href="../assertions-module/index.html" class="internal">assertions</a> —
|
||||
|
|
|
@ -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">§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">§2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2_12" class="paragraph-anchor"></a><b>§2.12. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Generate inter, part 4</span><span class="named-paragraph-number">2.12</span></span><span class="comment-syntax"> =</span>
|
||||
|
@ -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>§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 -> T2 -> T3 -> T4 -> ...</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 —
|
||||
</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 -> T2 -> X1 -> X2 -> X3 -> T3 -> T4 -> ...</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"> ↩</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">§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">() > </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">() > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LoopingOverScope::compilation_coroutine</span><span class="plain-syntax">() > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Responses::compilation_coroutine</span><span class="plain-syntax">() > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TextSubstitutions::compilation_coroutine</span><span class="plain-syntax">() > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">DeferredPropositions::compilation_coroutine</span><span class="plain-syntax">() > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
|
||||
<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="identifier-syntax">iterations</span><span class="plain-syntax"> > </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"> > </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>§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>§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">§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">§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">-></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">-></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">-></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">-></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">-></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">-></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>§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>§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">§2.11</a>, <a href="1-htc.html#SP2_13">§2.13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="identifier-syntax">iterations</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">repeat</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">repeat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="identifier-syntax">iterations</span><span class="plain-syntax">++;</span>
|
||||
<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>§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">() > </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">() > </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"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">iterations</span><span class="plain-syntax"> > </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">-></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>§7.1. </b>New entries are inserted in the queue at two write positions:
|
||||
</p>
|
||||
|
||||
<ul class="items"><li>● 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>● 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">-></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">-></span><span class="identifier-syntax">next_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_horizon</span><span class="plain-syntax">-></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">-></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">-></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">-></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"> > </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">-></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">-></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">-></span><span class="element-syntax">caused_by</span><span class="plain-syntax">-></span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">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">-></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">§7</a> (twice).</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§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">§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>§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">§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">-></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">-></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">-></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>§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">§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">-></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>§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">§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">-></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">§7.1</a>, <a href="1-htc.html#SP9">§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">-></span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">-></span><span class="element-syntax">description</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
|
|
|
@ -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">-></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">-></span><span class="element-syntax">compile_from</span><span class="plain-syntax">-></span><span class="identifier-syntax">head_of_defn</span><span class="plain-syntax">-></span><span class="identifier-syntax">at</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Sequence::queue</span><span class="plain-syntax">(&</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">§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">-></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>§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>§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">-></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">-></span><span class="element-syntax">compile_from</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> &</span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">total_phrases_to_compile</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">req</span><span class="plain-syntax">-></span><span class="element-syntax">compile_from</span><span class="plain-syntax">-></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">§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">-></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">-></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">-></span><span class="element-syntax">compile_from</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> &</span><span class="identifier-syntax">total_phrases_compiled</span><span class="plain-syntax">, </span><span class="identifier-syntax">total_phrases_to_compile</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">req</span><span class="plain-syntax">-></span><span class="element-syntax">compile_from</span><span class="plain-syntax">-></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>§5. </b>In Basic Inform, only, execution begins at the "To..." phrase "To begin", and
|
||||
|
|
|
@ -123,29 +123,18 @@ MathJax = {
|
|||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§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">§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">-></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>§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">§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">§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">-></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">-></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">§3.6.1.4.3.5</a>, <a href="4-cdp.html#SP3_6_1_7">§3.6.1.7</a>, <a href="4-cdp.html#SP3_6_1_10">§3.6.1.10</a>, <a href="4-cdp.html#SP3_6_1_12">§3.6.1.12</a>, <a href="4-cdp.html#SP3_6_1_14">§3.6.1.14</a>, <a href="4-cdp.html#SP3_6_1_16">§3.6.1.16</a>, <a href="4-cdp.html#SP3_6_1_19">§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">§3.6.1.4.3.5</a>, <a href="4-cdp.html#SP3_6_1_7">§3.6.1.7</a>, <a href="4-cdp.html#SP3_6_1_10">§3.6.1.10</a>, <a href="4-cdp.html#SP3_6_1_12">§3.6.1.12</a>, <a href="4-cdp.html#SP3_6_1_14">§3.6.1.14</a>, <a href="4-cdp.html#SP3_6_1_16">§3.6.1.16</a>, <a href="4-cdp.html#SP3_6_1_19">§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>
|
||||
|
||||
|
|
|
@ -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">§3</a>, <a href="4-dtd.html#SP4">§4</a>, <a href="4-dtd.html#SP9">§9</a>, <a href="4-dtd.html#SP10">§10</a>, <a href="4-dtd.html#SP11">§11</a>, <a href="4-dtd.html#SP13">§13</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_prop</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">reason</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Sequence::function_resources_allowed</span><span class="plain-syntax">() == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"too late now to defer propositions"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pdef</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">pcalc_prop_deferral</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="identifier-syntax">proposition_to_defer</span><span class="plain-syntax"> = </span><span class="identifier-syntax">prop</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="identifier-syntax">reason</span><span class="plain-syntax"> = </span><span class="identifier-syntax">reason</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="identifier-syntax">deferred_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="identifier-syntax">rtp_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pdef</span><span class="plain-syntax">-></span><span class="identifier-syntax">ppd_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Enclosures::new_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">PROPOSITIONS_HAP</span><span class="plain-syntax">, </span><span class="identifier-syntax">PROPOSITION_HL</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="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">(&</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>
|
||||
|
|
|
@ -92,7 +92,7 @@ enforced; it's fine to store arbitrary data with <span class="extract"><span cla
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::begin</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::begin</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">§1</a>, <a href="4-ll.html#SP2">§2</a><br/>Text Literals - <a href="4-tl.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">§1</a><br/>Responses - <a href="4-rsp.html#SP7_3">§7.3</a>, <a href="4-rsp.html#SP7_4">§7.4</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">§2.1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">§18.1</a><br/>Rules - <a href="5-rls.html#SP8_1_1">§8.1.1</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP9">§9</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a>, <a href="6-tm.html#SP3">§3</a><br/>Actions - <a href="7-act.html#SP1">§1</a><br/>Parsing - <a href="8-prs.html#SP2">§2</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::begin</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::begin</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">§1</a>, <a href="4-ll.html#SP2">§2</a><br/>Text Literals - <a href="4-tl.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">§1</a><br/>Responses - <a href="4-rsp.html#SP8_3">§8.3</a>, <a href="4-rsp.html#SP8_4">§8.4</a><br/>Box Quotations - <a href="4-bq.html#SP2">§2</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">§18.1</a><br/>Rules - <a href="5-rls.html#SP8_1_1">§8.1.1</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP9">§9</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a>, <a href="6-tm.html#SP3">§3</a><br/>Actions - <a href="7-act.html#SP1">§1</a><br/>Parsing - <a href="8-prs.html#SP2">§2</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Packaging::enter_home_of</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="2-ea.html#SP9" class="function-link"><span class="function-syntax">EmitArrays::begin_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax">;</span>
|
||||
|
@ -158,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">§1</a>, <a href="4-ll.html#SP2">§2</a>, <a href="4-ll.html#SP7_1">§7.1</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">§2.1</a><br/>Relation Literals - <a href="4-rl.html#SP1">§1</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">§1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP11">§11</a>, <a href="5-rsfk.html#SP18_1_1_1">§18.1.1.1</a>, <a href="5-rsfk.html#SP18_1_1_2">§18.1.1.2</a>, <a href="5-rsfk.html#SP22">§22</a><br/>Rules - <a href="5-rls.html#SP8_1_1">§8.1.1</a>, <a href="5-rls.html#SP8_1_2">§8.1.2</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP4_1_3">§4.1.3</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP8">§8</a>, <a href="5-rart.html#SP9_2">§9.2</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1_1_3">§4.1.1.1.1.3</a>, <a href="5-rsft.html#SP4_1_1_1_1_4">§4.1.1.1.1.4</a>, <a href="5-rsft.html#SP4_2_3">§4.2.3</a>, <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a><br/>Timed Rules - <a href="6-tr.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP1">§1</a>, <a href="7-act.html#SP2">§2</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::numeric_entry</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::numeric_entry</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">§1</a>, <a href="4-ll.html#SP2">§2</a>, <a href="4-ll.html#SP7_1">§7.1</a><br/>Box Quotations - <a href="4-bq.html#SP2">§2</a><br/>Relation Literals - <a href="4-rl.html#SP1">§1</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">§1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP11">§11</a>, <a href="5-rsfk.html#SP18_1_1_1">§18.1.1.1</a>, <a href="5-rsfk.html#SP18_1_1_2">§18.1.1.2</a>, <a href="5-rsfk.html#SP22">§22</a><br/>Rules - <a href="5-rls.html#SP8_1_1">§8.1.1</a>, <a href="5-rls.html#SP8_1_2">§8.1.2</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP4_1_3">§4.1.3</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP8">§8</a>, <a href="5-rart.html#SP9_2">§9.2</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1_1_3">§4.1.1.1.1.3</a>, <a href="5-rsft.html#SP4_1_1_1_1_4">§4.1.1.1.1.4</a>, <a href="5-rsft.html#SP4_2_3">§4.2.3</a>, <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a><br/>Timed Rules - <a href="6-tr.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP1">§1</a>, <a href="7-act.html#SP2">§2</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="2-ea.html#SP10" class="function-link"><span class="function-syntax">EmitArrays::entry_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
|
@ -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">§6.1</a><br/>Relation Literals - <a href="4-rl.html#SP1">§1</a><br/>Rules - <a href="5-rls.html#SP12">§12</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_1">§4.1.1</a>, <a href="5-rart.html#SP4_1_5">§4.1.5</a>, <a href="5-rart.html#SP5">§5</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">content</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::text_entry</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::text_entry</span></span>:<br/>Responses - <a href="4-rsp.html#SP6">§6</a><br/>Relation Literals - <a href="4-rl.html#SP1">§1</a><br/>Rules - <a href="5-rls.html#SP12">§12</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1_1">§4.1.1</a>, <a href="5-rart.html#SP4_1_5">§4.1.5</a>, <a href="5-rart.html#SP5">§5</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">content</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::text_value</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), &</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &</span><span class="identifier-syntax">v2</span><span class="plain-syntax">, </span><span class="identifier-syntax">content</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="2-ea.html#SP10" class="function-link"><span class="function-syntax">EmitArrays::entry_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
|
||||
|
@ -213,7 +213,7 @@ difference to compiled code.
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::end</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::end</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">§1</a>, <a href="4-ll.html#SP2">§2</a><br/>Text Literals - <a href="4-tl.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">§1</a><br/>Responses - <a href="4-rsp.html#SP7_3">§7.3</a>, <a href="4-rsp.html#SP7_4">§7.4</a><br/>Box Quotations - <a href="4-bq.html#SP2_1">§2.1</a><br/>Relation Literals - <a href="4-rl.html#SP1">§1</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">§1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">§18.1</a><br/>Rules - <a href="5-rls.html#SP8_1_5">§8.1.5</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP4_1_2">§4.1.2</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP9">§9</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">§4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1">§4.1.1.1.1</a>, <a href="5-rsft.html#SP4_2">§4.2</a>, <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a>, <a href="6-tm.html#SP3">§3</a><br/>Timed Rules - <a href="6-tr.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP1">§1</a>, <a href="7-act.html#SP2">§2</a><br/>Parsing - <a href="8-prs.html#SP2">§2</a><br/>Command Grammars - <a href="8-cg.html#SP7">§7</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EmitArrays::end</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">EmitArrays::end</span></span>:<br/>List Literals - <a href="4-ll.html#SP1">§1</a>, <a href="4-ll.html#SP2">§2</a><br/>Text Literals - <a href="4-tl.html#SP1">§1</a><br/>Text Substitutions - <a href="4-ts.html#SP1">§1</a><br/>Responses - <a href="4-rsp.html#SP8_3">§8.3</a>, <a href="4-rsp.html#SP8_4">§8.4</a><br/>Box Quotations - <a href="4-bq.html#SP2">§2</a><br/>Relation Literals - <a href="4-rl.html#SP1">§1</a><br/>Stored Action Literals - <a href="4-sal.html#SP1">§1</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP18_1">§18.1</a><br/>Rules - <a href="5-rls.html#SP8_1_5">§8.1.5</a>, <a href="5-rls.html#SP12">§12</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Verbs at Run Time - <a href="5-vart.html#SP4">§4</a><br/>Relations at Run Time - <a href="5-rart.html#SP4_1">§4.1</a>, <a href="5-rart.html#SP4_1_2">§4.1.2</a>, <a href="5-rart.html#SP5">§5</a>, <a href="5-rart.html#SP9">§9</a>, <a href="5-rart.html#SP9_3">§9.3</a><br/>Runtime Support for Tables - <a href="5-rsft.html#SP4_1_1_1">§4.1.1.1</a>, <a href="5-rsft.html#SP4_1_1_1_1">§4.1.1.1.1</a>, <a href="5-rsft.html#SP4_2">§4.2</a>, <a href="5-rsft.html#SP4_3">§4.3</a><br/>Chronology - <a href="5-chr.html#SP5">§5</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_2">§2.2</a>, <a href="6-tm.html#SP3">§3</a><br/>Timed Rules - <a href="6-tr.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP1">§1</a>, <a href="7-act.html#SP2">§2</a><br/>Parsing - <a href="8-prs.html#SP2">§2</a><br/>Command Grammars - <a href="8-cg.html#SP7">§7</a><br/>Figures - <a href="9-fgr.html#SP1">§1</a><br/>Sound Effects - <a href="9-se.html#SP1">§1</a><br/>External Files - <a href="9-ef.html#SP1">§1</a><br/>Test Scripts - <a href="10-ts.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="2-ea.html#SP11" class="function-link"><span class="function-syntax">EmitArrays::end_inner</span></a><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Packaging::exit</span><span class="plain-syntax">(</span><a href="2-emt.html#SP1" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -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">§2</a><br/>Use Options - <a href="3-uo.html#SP1_1">§1.1</a>, <a href="3-uo.html#SP1_3">§1.3</a><br/>Responses - <a href="4-rsp.html#SP6_1">§6.1</a>, <a href="4-rsp.html#SP7_2">§7.2</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP26">§26</a>, <a href="5-rsfk.html#SP30">§30</a><br/>Rules - <a href="5-rls.html#SP10">§10</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Relations at Run Time - <a href="5-rart.html#SP9_3">§9.3</a><br/>Chronology - <a href="5-chr.html#SP7">§7</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_1">§2.1</a><br/>The Score - <a href="6-ts.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP2">§2</a><br/>Command Grammars - <a href="8-cg.html#SP1">§1</a>, <a href="8-cg.html#SP2">§2</a><br/>External Files - <a href="9-ef.html#SP1">§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">§2</a><br/>Use Options - <a href="3-uo.html#SP1_1">§1.1</a>, <a href="3-uo.html#SP1_3">§1.3</a><br/>Responses - <a href="4-rsp.html#SP6">§6</a>, <a href="4-rsp.html#SP8_2">§8.2</a><br/>Runtime Support for Kinds - <a href="5-rsfk.html#SP26">§26</a>, <a href="5-rsfk.html#SP30">§30</a><br/>Rules - <a href="5-rls.html#SP10">§10</a><br/>Activities - <a href="5-act.html#SP2">§2</a><br/>Relations at Run Time - <a href="5-rart.html#SP9_3">§9.3</a><br/>Chronology - <a href="5-chr.html#SP7">§7</a><br/>The Player - <a href="6-tp.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_1">§2.1</a><br/>The Score - <a href="6-ts.html#SP1">§1</a><br/>Actions - <a href="7-act.html#SP2">§2</a><br/>Command Grammars - <a href="8-cg.html#SP1">§1</a>, <a href="8-cg.html#SP2">§2</a><br/>External Files - <a href="9-ef.html#SP1">§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">§23</a><br/>Fundamental Constants - <a href="3-fc.html#SP1_1">§1.1</a>, <a href="3-fc.html#SP1_2">§1.2</a><br/>Text Literals - <a href="4-tl.html#SP4">§4</a><br/>Responses - <a href="4-rsp.html#SP6_1">§6.1</a><br/>Rules - <a href="5-rls.html#SP14">§14</a><br/>Bibliographic Data - <a href="6-bd.html#SP2">§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">§23</a><br/>Fundamental Constants - <a href="3-fc.html#SP1_1">§1.1</a>, <a href="3-fc.html#SP1_2">§1.2</a><br/>Text Literals - <a href="4-tl.html#SP4">§4</a><br/>Responses - <a href="4-rsp.html#SP6">§6</a><br/>Rules - <a href="5-rls.html#SP14">§14</a><br/>Bibliographic Data - <a href="6-bd.html#SP2">§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">§6.1</a><br/>Rules - <a href="5-rls.html#SP2">§2</a>, <a href="5-rls.html#SP8">§8</a>, <a href="5-rls.html#SP14">§14</a><br/>Instance Counting - <a href="5-ic.html#SP9">§9</a><br/>Relations at Run Time - <a href="5-rart.html#SP1">§1</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>Spatial - <a href="6-spt.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_1">§2.1</a><br/>The Score - <a href="6-ts.html#SP1">§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">§6</a><br/>Rules - <a href="5-rls.html#SP2">§2</a>, <a href="5-rls.html#SP8">§8</a>, <a href="5-rls.html#SP14">§14</a><br/>Instance Counting - <a href="5-ic.html#SP9">§9</a><br/>Relations at Run Time - <a href="5-rart.html#SP1">§1</a><br/>Naming - <a href="6-nmn.html#SP2">§2</a><br/>Spatial - <a href="6-spt.html#SP1">§1</a><br/>The Map - <a href="6-tm.html#SP2_1">§2.1</a><br/>The Score - <a href="6-ts.html#SP1">§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
|
@ -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">(&</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">-></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>§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>§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">-></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">-></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>§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">§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">-></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">-></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">§2</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-rsp.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-fc.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-enc.html">enc</a></li><li class="progresssection"><a href="4-ll.html">ll</a></li><li class="progresssection"><a href="4-tl.html">tl</a></li><li class="progresssection"><a href="4-ts.html">ts</a></li><li class="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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -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">-></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">-></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">-></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">-></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">(&</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">-></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>§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>§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>§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">§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">-></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">-></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">§3</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-sal.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-fc.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-enc.html">enc</a></li><li class="progresssection"><a href="4-ll.html">ll</a></li><li class="progresssection"><a href="4-tl.html">tl</a></li><li class="progresssection"><a href="4-ts.html">ts</a></li><li class="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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -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">-></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">-></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">-></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">-></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">(&</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">-></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">-></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>§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>§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">-></span><span class="identifier-syntax">list_compiled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">ll</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="identifier-syntax">ll</span><span class="plain-syntax">-></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">-></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">§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">-></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">-></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>§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">§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">§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>
|
||||
|
|
|
@ -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">§1. Introduction</a></li><li><a href="4-rsp.html#SP4">§4. How rules gain responses</a></li><li><a href="4-rsp.html#SP6">§6. Compilation</a></li><li><a href="4-rsp.html#SP7">§7. Synoptic resources</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="4-rsp.html#SP1">§1. Introduction</a></li><li><a href="4-rsp.html#SP4">§4. How rules gain responses</a></li><li><a href="4-rsp.html#SP6">§6. Compilation</a></li><li><a href="4-rsp.html#SP8">§8. Synoptic resources</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Introduction. </b>Responses are texts — which may be either literals or text substitutions —
|
||||
occurring inside the body of rules, and marked out (A), (B), (C), ... within
|
||||
|
@ -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">-></span><span class="identifier-syntax">the_rule</span><span class="plain-syntax"> = </span><span class="identifier-syntax">R</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="identifier-syntax">the_marker</span><span class="plain-syntax"> = </span><span class="identifier-syntax">marker</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="identifier-syntax">launcher_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="identifier-syntax">via_Inter</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="identifier-syntax">via_Inter_routine_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PR</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP21" class="function-link"><span class="function-syntax">Hierarchy::package_within</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RESPONSES_HAP</span><span class="plain-syntax">, </span><a href="5-rls.html#SP2" class="function-link"><span class="function-syntax">RTRules::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">));</span>
|
||||
|
@ -173,6 +171,10 @@ through a sentence like:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="identifier-syntax">the_ts</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP5" class="function-link"><span class="function-syntax">TextSubstitutions::new_text_substitution</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">frame</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">marker</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-ts.html#SP4" class="function-link"><span class="function-syntax">TextSubstitutions::value_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="element-syntax">the_ts</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="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">-></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">(&</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">-></span><span class="element-syntax">value_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Responses::response_constant_iname</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Responses::response_constant_iname</span></span>:<br/><a href="4-rsp.html#SP6_1">§6.1</a></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">§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">-></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">-></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">-></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">(&</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>§6. Compilation. </b>Values and launchers for responses are then compiled in due course by the
|
||||
following coroutine (see <a href="../core-module/1-htc.html" class="internal">How To Compile (in core)</a>):
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Responses::compilation_coroutine</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">resp</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">resp</span><span class="plain-syntax">, </span><span class="reserved-syntax">response_message</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="element-syntax">launcher_compiled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="element-syntax">launcher_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Compile resources needed by this response</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="element-syntax">via_Inter</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="element-syntax">via_Inter_routine_compiled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">r2</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">r2</span><span class="plain-syntax">, </span><span class="reserved-syntax">response_message</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">r2</span><span class="plain-syntax">-></span><span class="element-syntax">the_rule</span><span class="plain-syntax"> == </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="element-syntax">the_rule</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">r2</span><span class="plain-syntax">-></span><span class="element-syntax">via_Inter_routine_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rsp.html#SP6_2" class="named-paragraph-link"><span class="named-paragraph">Compile the response-handler function for this rule</span><span class="named-paragraph-number">6.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>§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">§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">-></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">-></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">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_2" class="paragraph-anchor"></a><b>§6.2. </b>Something skated over above is that responses can also be created when the
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§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">§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">-></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">-></span><span class="element-syntax">via_Inter_routine_compiled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">response_message</span><span class="plain-syntax"> *</span><span class="identifier-syntax">r2</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">r2</span><span class="plain-syntax">, </span><span class="reserved-syntax">response_message</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">r2</span><span class="plain-syntax">-></span><span class="element-syntax">the_rule</span><span class="plain-syntax"> == </span><span class="identifier-syntax">resp</span><span class="plain-syntax">-></span><span class="element-syntax">the_rule</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">r2</span><span class="plain-syntax">-></span><span class="element-syntax">via_Inter_routine_compiled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="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>§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">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§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">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§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>§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>§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">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_2" class="paragraph-anchor"></a><b>§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">§8</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP8_2" class="paragraph-anchor"></a><b>§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">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_3" class="paragraph-anchor"></a><b>§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">§8</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP8_3" class="paragraph-anchor"></a><b>§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">§7</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP7_4" class="paragraph-anchor"></a><b>§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">§8</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP8_4" class="paragraph-anchor"></a><b>§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">§7</a>.</li></ul>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="4-rsp.html#SP8">§8</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="4-ts.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-fc.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-enc.html">enc</a></li><li class="progresssection"><a href="4-ll.html">ll</a></li><li class="progresssection"><a href="4-tl.html">tl</a></li><li class="progresssection"><a href="4-ts.html">ts</a></li><li class="progresscurrent">rsp</li><li class="progresssection"><a href="4-bq.html">bq</a></li><li class="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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -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">§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">§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>
|
||||
|
|
|
@ -247,7 +247,7 @@ case of a response to a rule, since those are never perishable.
|
|||
<span class="plain-syntax"> function ----------------------> ...</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">§2.1</a>, <a href="4-ts.html#SP2_2">§2.2</a><br/>Responses - <a href="4-rsp.html#SP2">§2</a>, <a href="4-rsp.html#SP6_1">§6.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">TextSubstitutions::value_iname</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">TextSubstitutions::value_iname</span></span>:<br/><a href="4-ts.html#SP2_1">§2.1</a>, <a href="4-ts.html#SP2_2">§2.2</a><br/>Responses - <a href="4-rsp.html#SP2">§2</a>, <a href="4-rsp.html#SP6">§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">-></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 — 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">-></span><span class="element-syntax">unsubstituted_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">sentence_using_this</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">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 — see <a href="4-rsp.html" class="internal
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">owning_point</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Functions::defn_being_compiled</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">idb</span><span class="plain-syntax">) </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">owning_point</span><span class="plain-syntax"> = </span><span class="identifier-syntax">idb</span><span class="plain-syntax">-></span><span class="identifier-syntax">head_of_defn</span><span class="plain-syntax">-></span><span class="identifier-syntax">at</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">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">(&</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">-></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>§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>§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">§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">-></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">-></span><span class="element-syntax">tr_done_already</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">tr_done_already</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">makes_local_refs</span><span class="plain-syntax"> = </span><a href="4-ts.html#SP7" class="function-link"><span class="function-syntax">TextSubstitutions::compile_function</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-ts.html#SP1" class="function-link"><span class="function-syntax">TextSubstitutions::compile_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">ts_value_iname</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">ts_function_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">makes_local_refs</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
||||
<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">-></span><span class="element-syntax">ts_value_iname</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">ts_function_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">makes_local_refs</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="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>§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>§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">§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">§6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_substitution</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ts</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEXT_SUBSTITUTIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Compiling text routine %d %08x %W\n"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">using_frame</span><span class="plain-syntax">), </span><span class="identifier-syntax">ts</span><span class="plain-syntax">-></span><span class="element-syntax">unsubstituted_text</span><span class="plain-syntax">);</span>
|
||||
|
||||
|
@ -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>§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">§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">§8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">it_is_not_worth_adding</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">compiling_text_routines_mode</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">current_ts_being_compiled</span><span class="plain-syntax">) &&</span>
|
||||
|
|
|
@ -132,7 +132,7 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">shell_routine_iname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::iname</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">RTRules::iname</span></span>:<br/><a href="5-rls.html#SP4_2">§4.2</a>, <a href="5-rls.html#SP5_2">§5.2</a>, <a href="5-rls.html#SP5_2_1">§5.2.1</a><br/>Responses - <a href="4-rsp.html#SP6_1">§6.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::iname</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">RTRules::iname</span></span>:<br/><a href="5-rls.html#SP4_2">§4.2</a>, <a href="5-rls.html#SP5_2">§5.2</a>, <a href="5-rls.html#SP5_2_1">§5.2.1</a><br/>Responses - <a href="4-rsp.html#SP6">§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">-></span><span class="identifier-syntax">defn_as_I7_source</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">CompileImperativeDefn::iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">-></span><span class="identifier-syntax">defn_as_I7_source</span><span class="plain-syntax">-></span><span class="identifier-syntax">body_of_defn</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">rule_extern_iname</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">-></span><span class="identifier-syntax">applicability_constraints</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
|
||||
|
@ -153,7 +153,7 @@ function togglePopup(material_id) {
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">xiname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">xiname</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::get_handler_definition</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">RTRules::get_handler_definition</span></span>:<br/>Responses - <a href="4-rsp.html#SP6_2">§6.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
|
||||
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTRules::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">§7.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rule_extern_response_handler_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">R</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rule_extern_response_handler_iname</span><span class="plain-syntax"> =</span>
|
||||
<span class="plain-syntax"> </span><a href="2-hrr.html#SP15" class="function-link"><span class="function-syntax">Hierarchy::derive_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">RESPONDER_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">xiname</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-></span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">rule_package</span><span class="plain-syntax">);</span>
|
||||
|
|
|
@ -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">§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">§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>
|
||||
|
|
|
@ -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">-></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">-></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">(&</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>§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">-></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">-></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">§2</a>.</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="8-gpr.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-fc.html">3</a></li><li class="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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -89,7 +89,7 @@ Inform must also work out the kind — here, it's "list of numbers".
|
|||
no indication of its kind — 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 — 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"><list-conts></span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">\}</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> { -, Lists::at(RP[1], W) }</span>
|
||||
|
||||
<span class="Preform-function-syntax"><list-conts></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><list-entry></span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><list-conts></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></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"><list-entry></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></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"><list-entry></span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><list-conts></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></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"><list-entry></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> { 0, Lists::add(RP[1], Lists::empty_literal(W), W, R[1]) }</span>
|
||||
|
||||
<span class="Preform-function-syntax"><list-entry></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><s-value></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></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">==></span><span class="Preform-plain-syntax"> { TRUE, Specifications::new_UNKNOWN(W) }</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><s-value></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></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">==></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>§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">§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">-></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">-></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">-></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">-></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">-></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>
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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// --
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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@> =
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue