mirror of
https://github.com/ganelson/inform.git
synced 2024-06-26 04:00:43 +03:00
Refactored compilation of arithmetic operations
This commit is contained in:
parent
ec38eb8d2f
commit
2958d7ae19
|
@ -1,6 +1,6 @@
|
|||
# Inform 7
|
||||
|
||||
[Version](notes/versioning.md): 10.2.0-beta+6X47 'Krypton' (24 April 2024)
|
||||
[Version](notes/versioning.md): 10.2.0-beta+6X48 'Krypton' (26 April 2024)
|
||||
|
||||
## About Inform
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Prerelease: beta
|
||||
Build Date: 24 April 2024
|
||||
Build Number: 6X47
|
||||
Build Date: 26 April 2024
|
||||
Build Number: 6X48
|
||||
|
|
|
@ -306,8 +306,10 @@ of both A and B.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">asch</span><span class="plain-syntax">-></span><span class="identifier-syntax">schema</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="8-terr.html#SP7_3" class="named-paragraph-link"><span class="named-paragraph">Exceptional case of setting the "player" global variable</span><span class="named-paragraph-number">7.3</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">asch</span><span class="plain-syntax">-></span><span class="identifier-syntax">schema</span><span class="plain-syntax">, </span><span class="string-syntax">"%s"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">CompileLvalues::interpret_store</span><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">, </span><span class="identifier-syntax">st</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">st</span><span class="plain-syntax">[1], </span><span class="constant-syntax">0</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">prototype</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">CompileLvalues::interpret_store</span><span class="plain-syntax">(</span><span class="identifier-syntax">prototype</span><span class="plain-syntax">, </span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">, </span><span class="identifier-syntax">st</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">st</span><span class="plain-syntax">[1], </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">asch</span><span class="plain-syntax">-></span><span class="identifier-syntax">schema</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prototype</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">prototype</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="8-terr.html#SP7_6" class="named-paragraph-link"><span class="named-paragraph">Add kind-checking code for run-time checking</span><span class="named-paragraph-number">7.6</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">TRUE</span><span class="plain-syntax">;</span>
|
||||
|
|
|
@ -352,19 +352,14 @@ change if arbitrary-precision integers are ever added to Inform, for instance.
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="function-syntax">CompileLvalues::interpret_store</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">CompileLvalues::interpret_store</span></span>:<br/>Compile Invocations Inline - <a href="5-cii.html#SP6_6_4">§6.6.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">left</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">right</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">inc</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileLvalues::interpret_store</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">CompileLvalues::interpret_store</span></span>:<br/>Compile Invocations Inline - <a href="5-cii.html#SP6_6_4">§6.6.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">left</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">right</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">inc</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">KIND_CHECKING</span><span class="plain-syntax">, </span><span class="string-syntax">"Interpreting assignment of kinds %u, %u\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">left</span><span class="plain-syntax">, </span><span class="identifier-syntax">right</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><span class="identifier-syntax">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">left</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">right</span><span class="plain-syntax">)) { </span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">left</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</span><span class="plain-syntax">; </span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><span class="identifier-syntax">right</span><span class="plain-syntax">-></span><span class="identifier-syntax">construct</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">form</span><span class="plain-syntax"> = </span><span class="constant-syntax">STORE_WORD_TO_WORD</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">inc</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">form</span><span class="plain-syntax"> = </span><span class="constant-syntax">INCREASE_BY_WORD</span><span 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::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">left</span><span class="plain-syntax">)) </span><span class="identifier-syntax">form</span><span class="plain-syntax"> = </span><span class="constant-syntax">INCREASE_BY_REAL</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">inc</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">form</span><span class="plain-syntax"> = </span><span class="constant-syntax">DECREASE_BY_WORD</span><span 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::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">left</span><span class="plain-syntax">)) </span><span class="identifier-syntax">form</span><span class="plain-syntax"> = </span><span class="constant-syntax">DECREASE_BY_REAL</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">inc</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">form</span><span class="plain-syntax"> = </span><span class="constant-syntax">INCREASE_BY_WORD</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">inc</span><span class="plain-syntax"> < </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">form</span><span class="plain-syntax"> = </span><span class="constant-syntax">DECREASE_BY_WORD</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">KindConstructors::uses_block_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">KindConstructors::allow_word_as_pointer</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">form</span><span class="plain-syntax"> = </span><span class="constant-syntax">STORE_WORD_TO_POINTER</span><span class="plain-syntax">;</span>
|
||||
|
@ -376,12 +371,7 @@ change if arbitrary-precision integers are ever added to Inform, for instance.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">inc</span><span class="plain-syntax"> < </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">form</span><span class="plain-syntax"> = </span><span class="constant-syntax">DECREASE_BY_POINTER</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">reduce</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KT</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TimesOfDay::kind</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">KT</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">left</span><span class="plain-syntax">, </span><span class="identifier-syntax">KT</span><span class="plain-syntax">))) </span><span class="identifier-syntax">reduce</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">endif</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-cl.html#SP5" class="function-link"><span class="function-syntax">CompileLvalues::storage_schema</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">, </span><span class="identifier-syntax">form</span><span class="plain-syntax">, </span><span class="identifier-syntax">reduce</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="2-cl.html#SP5" class="function-link"><span class="function-syntax">CompileLvalues::storage_schema</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">, </span><span class="identifier-syntax">form</span><span class="plain-syntax">, </span><span class="identifier-syntax">left</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>Which uses:
|
||||
|
@ -391,107 +381,64 @@ change if arbitrary-precision integers are ever added to Inform, for instance.
|
|||
<span class="definition-keyword">define</span> <span class="constant-syntax">STORE_WORD_TO_POINTER</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">STORE_POINTER_TO_POINTER</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">INCREASE_BY_WORD</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">INCREASE_BY_REAL</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">INCREASE_BY_POINTER</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">DECREASE_BY_WORD</span><span class="plain-syntax"> </span><span class="constant-syntax">7</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">DECREASE_BY_REAL</span><span class="plain-syntax"> </span><span class="constant-syntax">8</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">DECREASE_BY_POINTER</span><span class="plain-syntax"> </span><span class="constant-syntax">9</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">INCREASE_BY_POINTER</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">DECREASE_BY_WORD</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span>
|
||||
<span class="definition-keyword">define</span> <span class="constant-syntax">DECREASE_BY_POINTER</span><span class="plain-syntax"> </span><span class="constant-syntax">7</span>
|
||||
</pre>
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="function-syntax">CompileLvalues::storage_schema</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">CompileLvalues::storage_schema</span></span>:<br/><a href="2-cl.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_of_store</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">reducing_modulo_1440</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileLvalues::storage_schema</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">CompileLvalues::storage_schema</span></span>:<br/><a href="2-cl.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">storage_class</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">kind_of_store</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_of_store</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">STORE_WORD_TO_WORD:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = *<2"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = *<2"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*$1(*%1,1,*<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteGProperty(*|1,*<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteLIST_OF_TY_GetItem(*%1,*<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-*1 = *<2"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-*1 = *<2"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-*$1(*%1,1,*<2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-WriteGProperty(*|1,*<2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-WriteLIST_OF_TY_GetItem(*%1,*<2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</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="string-syntax">""</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">STORE_WORD_TO_POINTER:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-CastPV(*1, *#2, *2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-CastPV(*1, *#2, *2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-CastPV(*$1(*%1, 5), *#2, *2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-CastPV(*+1, *#2, *2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-CastPV(*1, *#2, *2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-CastPV(*1, *#2, *2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-CastPV(*1, *#2, *2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-CastPV(*$1(*%1, 5), *#2, *2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-CastPV(*+1, *#2, *2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-CastPV(*1, *#2, *2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</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="string-syntax">""</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">STORE_POINTER_TO_POINTER:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-CopyPV(*1, *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-CopyPV(*1, *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-CopyPV(*$1(*%1, 5), *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-CopyPV(*+1, *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-CopyPV(*1, *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-CopyPV(*1, *<2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-CopyPV(*1, *<2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-CopyPV(*$1(*%1, 5), *<2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-CopyPV(*+1, *<2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-CopyPV(*1, *<2)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</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="string-syntax">""</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">INCREASE_BY_WORD:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">reducing_modulo_1440</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = NUMBER_TY_to_TIME_TY(*1 + *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = NUMBER_TY_to_TIME_TY(*1 + *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*$1(*%1,1,NUMBER_TY_to_TIME_TY(*1 + *<2))"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteGProperty(*|1,NUMBER_TY_to_TIME_TY(*+1 + *<2))"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteLIST_OF_TY_GetItem(*%1,NUMBER_TY_to_TIME_TY(*1 + *<2))"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = *1 + *<2"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = *1 + *<2"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*$1(*%1, 1, *1 + *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteGProperty(*|1,*+1 + *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteLIST_OF_TY_GetItem(*%1,*1 + *<2)"</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="string-syntax">""</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">INCREASE_BY_REAL:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DECREASE_BY_WORD:</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">close</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">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = REAL_NUMBER_TY_Plus(*1, *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = REAL_NUMBER_TY_Plus(*1, *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*$1(*%1,1,REAL_NUMBER_TY_Plus(*1, *<2))"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteGProperty(*|1,REAL_NUMBER_TY_Plus(*+1, *<2))"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteLIST_OF_TY_GetItem(*%1,REAL_NUMBER_TY_Plus(*1, *<2))"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-*1 = "</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-*1 = "</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-*$1(*%1,1,"</span><span class="plain-syntax">); </span><span class="identifier-syntax">close</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-WriteGProperty(*|1,"</span><span class="plain-syntax">); </span><span class="identifier-syntax">close</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="string-syntax">"*=-WriteLIST_OF_TY_GetItem(*%1,"</span><span class="plain-syntax">); </span><span class="identifier-syntax">close</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</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="string-syntax">""</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">operation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PLUS_OPERATION</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kind_of_store</span><span class="plain-syntax"> == </span><span class="constant-syntax">DECREASE_BY_WORD</span><span class="plain-syntax">) </span><span class="identifier-syntax">operation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">MINUS_OPERATION</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP3" class="function-link"><span class="function-syntax">CompileArithmetic::schema</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">operation</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"*1"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"*<2"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">close</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">")"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">INCREASE_BY_POINTER:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"pointer value increments not implemented"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">""</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DECREASE_BY_WORD:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">reducing_modulo_1440</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = NUMBER_TY_to_TIME_TY(*1 - *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = NUMBER_TY_to_TIME_TY(*1 - *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*$1(*%1,1,NUMBER_TY_to_TIME_TY(*1 - *<2))"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteGProperty(*|1,NUMBER_TY_to_TIME_TY(*+1 - *<2))"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteLIST_OF_TY_GetItem(*%1,NUMBER_TY_to_TIME_TY(*1 - *<2))"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = *1 - *<2"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = *1 - *<2"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*$1(*%1,1,*1 - *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteGProperty(*|1,*+1 - *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteLIST_OF_TY_GetItem(*%1,*1 - *<2)"</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="string-syntax">""</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DECREASE_BY_REAL:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = REAL_NUMBER_TY_Minus(*1, *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NONLOCAL_VARIABLE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*1 = REAL_NUMBER_TY_Minus(*1, *<2)"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TABLE_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-*$1(*%1,1,REAL_NUMBER_TY_Minus(*1, *<2))"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_VALUE_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteGProperty(*|1,REAL_NUMBER_TY_Minus(*+1, *<2))"</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LIST_ENTRY_NT:</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">"*=-WriteLIST_OF_TY_GetItem(*%1,REAL_NUMBER_TY_Minus(*1, *<2))"</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="string-syntax">""</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DECREASE_BY_POINTER:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"pointer value decrements not implemented"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="string-syntax">""</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</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="string-syntax">""</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
|
|
|
@ -163,7 +163,7 @@ line 3 must not.
|
|||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileValues::to_code_val</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">CompileValues::to_code_val</span></span>:<br/>Compile Rvalues - <a href="2-cr.html#SP1_3">§1.3</a><br/>Compile Lvalues - <a href="2-cl.html#SP1_3">§1.3</a>, <a href="2-cl.html#SP1_3_2">§1.3.2</a>, <a href="2-cl.html#SP1_4">§1.4</a>, <a href="2-cl.html#SP2">§2</a><br/>Compile Conditions - <a href="2-cc.html#SP1">§1</a>, <a href="2-cc.html#SP1_1">§1.1</a>, <a href="2-cc.html#SP1_2">§1.2</a><br/>Matching Action Patterns - <a href="2-map.html#SP3_5_1_1_1_25">§3.5.1.1.1.25</a>, <a href="2-map.html#SP5">§5</a>, <a href="2-map.html#SP5_2_1">§5.2.1</a>, <a href="2-map.html#SP5_2_2">§5.2.2</a>, <a href="2-map.html#SP5_2_3">§5.2.3</a><br/>Compile Loops - <a href="4-cl.html#SP1_2">§1.2</a>, <a href="4-cl.html#SP2">§2</a>, <a href="4-cl.html#SP4">§4</a><br/>Deciding to Defer - <a href="4-dtd.html#SP4_2">§4.2</a>, <a href="4-dtd.html#SP15">§15</a>, <a href="4-dtd.html#SP17">§17</a>, <a href="4-dtd.html#SP18">§18</a>, <a href="4-dtd.html#SP20">§20</a>, <a href="4-dtd.html#SP21">§21</a>, <a href="4-dtd.html#SP22">§22</a><br/>Cinders and Deferrals - <a href="4-cad.html#SP4">§4</a><br/>Compile Invocations As Calls - <a href="5-ciac.html#SP3">§3</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP11">§11</a>, <a href="5-cii.html#SP12">§12</a><br/>Compile Solutions to Equations - <a href="5-cste.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="2-cv.html#SP5" class="function-link"><span class="function-syntax">CompileValues::to_code_val_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="constant-syntax">COMPILE_SPEC_AS_VALUE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileValues::to_code_val_of_kind</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">CompileValues::to_code_val_of_kind</span></span>:<br/>Compile Rvalues - <a href="2-cr.html#SP6">§6</a><br/>Compile Schemas - <a href="4-cs.html#SP3_2">§3.2</a>, <a href="4-cs.html#SP5_2">§5.2</a><br/>Compile Blocks and Lines - <a href="5-cbal.html#SP4_4_5_2">§4.4.5.2</a>, <a href="5-cbal.html#SP4_4_5_5">§4.4.5.5</a>, <a href="5-cbal.html#SP4_4_5_1_2">§4.4.5.1.2</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP6_1_1_3">§6.1.1.3</a>, <a href="5-cii.html#SP6_1_1_4_9">§6.1.1.4.9</a>, <a href="5-cii.html#SP6_1_1_4_10">§6.1.1.4.10</a>, <a href="5-cii.html#SP6_6_8">§6.6.8</a>, <a href="5-cii.html#SP6_6_8_1">§6.6.8.1</a>, <a href="5-cii.html#SP6_6_8_2">§6.6.8.2</a>, <a href="5-cii.html#SP6_6_8_3">§6.6.8.3</a><br/>Compile Arithmetic - <a href="5-ca.html#SP1_3_1">§1.3.1</a>, <a href="5-ca.html#SP1_3_2">§1.3.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileValues::to_code_val_of_kind</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">CompileValues::to_code_val_of_kind</span></span>:<br/>Compile Rvalues - <a href="2-cr.html#SP6">§6</a><br/>Compile Schemas - <a href="4-cs.html#SP3_2">§3.2</a>, <a href="4-cs.html#SP5_2">§5.2</a><br/>Compile Blocks and Lines - <a href="5-cbal.html#SP4_4_5_2">§4.4.5.2</a>, <a href="5-cbal.html#SP4_4_5_5">§4.4.5.5</a>, <a href="5-cbal.html#SP4_4_5_1_2">§4.4.5.1.2</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP6_1_1_3">§6.1.1.3</a>, <a href="5-cii.html#SP6_1_1_4_9">§6.1.1.4.9</a>, <a href="5-cii.html#SP6_1_1_4_10">§6.1.1.4.10</a>, <a href="5-cii.html#SP6_6_8">§6.6.8</a>, <a href="5-cii.html#SP6_6_8_1">§6.6.8.1</a>, <a href="5-cii.html#SP6_6_8_2">§6.6.8.2</a>, <a href="5-cii.html#SP6_6_8_3">§6.6.8.3</a><br/>Compile Arithmetic - <a href="5-ca.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="2-cv.html#SP5" class="function-link"><span class="function-syntax">CompileValues::to_code_val_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="constant-syntax">COMPILE_SPEC_AS_VALUE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileValues::to_fresh_code_val_of_kind</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">CompileValues::to_fresh_code_val_of_kind</span></span>:<br/>Compile Schemas - <a href="4-cs.html#SP3_2">§3.2</a>, <a href="4-cs.html#SP5_2">§5.2</a><br/>Compile Invocations - <a href="5-ci.html#SP1_3_1_2_1_2">§1.3.1.2.1.2</a><br/>Compile Invocations As Calls - <a href="5-ciac.html#SP2_2">§2.2</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP6_1_1_3">§6.1.1.3</a>, <a href="5-cii.html#SP6_1_1_4_7_1">§6.1.1.4.7.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
||||
|
|
|
@ -86,15 +86,20 @@ in several different ways.
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::from_terms_in_void_context</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">CompileSchemas::from_terms_in_void_context</span></span>:<br/>Compile Deferred Propositions - <a href="4-cdp.html#SP5">§5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt2</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cs.html#SP2" class="function-link"><span class="function-syntax">CompileSchemas::sch_emit_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt2</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cs.html#SP2" class="function-link"><span class="function-syntax">CompileSchemas::sch_emit_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt2</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::from_terms_in_val_context</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">CompileSchemas::from_terms_in_val_context</span></span>:<br/><a href="4-cs.html#SP5_3">§5.3</a><br/>Stack Frames - <a href="3-sf.html#SP21">§21</a><br/>Compile Invocations Inline - <a href="5-cii.html#SP6_6_4">§6.6.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt2</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cs.html#SP2" class="function-link"><span class="function-syntax">CompileSchemas::sch_emit_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt2</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cs.html#SP2" class="function-link"><span class="function-syntax">CompileSchemas::sch_emit_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt2</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::from_local_variables_in_void_context</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">CompileSchemas::from_local_variables_in_void_context</span></span>:<br/>Compile Loops - <a href="4-cl.html#SP1_2">§1.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">,</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::with_callbacks_in_val_context</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">CompileSchemas::with_callbacks_in_val_context</span></span>:<br/>Compile Arithmetic - <a href="5-ca.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</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">opaque1</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">opaque2</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">f</span><span class="plain-syntax">)(</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">opaque</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cs.html#SP2" class="function-link"><span class="function-syntax">CompileSchemas::sch_emit_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">opaque1</span><span class="plain-syntax">, </span><span class="identifier-syntax">opaque2</span><span class="plain-syntax">, </span><span class="identifier-syntax">f</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::from_local_variables_in_void_context</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">CompileSchemas::from_local_variables_in_void_context</span></span>:<br/>Compile Loops - <a href="4-cl.html#SP1_2">§1.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">v2</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> </span><span class="identifier-syntax">pt1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Terms::new_constant</span><span class="plain-syntax">(</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Lvalues::new_LOCAL_VARIABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="identifier-syntax">v1</span><span class="plain-syntax">));</span>
|
||||
|
@ -112,7 +117,7 @@ in several different ways.
|
|||
<span class="plain-syntax"> </span><a href="4-cs.html#SP1" class="function-link"><span class="function-syntax">CompileSchemas::from_terms_in_val_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, &</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, &</span><span class="identifier-syntax">pt2</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">CompileSchemas::from_annotated_schema</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">CompileSchemas::from_annotated_schema</span></span>:<br/>Compile Atoms - <a href="4-ca.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">annotated_i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">asch</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::from_annotated_schema</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">CompileSchemas::from_annotated_schema</span></span>:<br/>Compile Atoms - <a href="4-ca.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">annotated_i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">asch</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">asch</span><span class="plain-syntax">-></span><span class="identifier-syntax">negate_schema</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">NOT_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
|
@ -137,11 +142,13 @@ as above), we fill in its kind.
|
|||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">i6s_emission_state</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">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ops_termwise</span><span class="plain-syntax">[2];</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ops_termwise_opaque</span><span class="plain-syntax">[2];</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">opaque_term_compiler</span><span class="plain-syntax">)(</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">opaque</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">by_ref</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">i6s_emission_state</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::sch_emit_inner</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">CompileSchemas::sch_emit_inner</span></span>:<br/><a href="4-cs.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt2</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">void_context</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::sch_emit_inner</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">CompileSchemas::sch_emit_inner</span></span>:<br/><a href="4-cs.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt2</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">opaque1</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">opaque2</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">f</span><span class="plain-syntax">)(</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">opaque</span><span class="plain-syntax">), </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">void_context</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">i6s_emission_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">ems</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">-></span><span class="identifier-syntax">constant</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">-></span><span class="identifier-syntax">term_checked_as_kind</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">pt1</span><span class="plain-syntax">-></span><span class="identifier-syntax">term_checked_as_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">-></span><span class="identifier-syntax">constant</span><span class="plain-syntax">);</span>
|
||||
|
@ -149,6 +156,9 @@ as above), we fill in its kind.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">pt2</span><span class="plain-syntax">-></span><span class="identifier-syntax">term_checked_as_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">pt2</span><span class="plain-syntax">-></span><span class="identifier-syntax">constant</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ems</span><span class="plain-syntax">.</span><span class="element-syntax">ops_termwise</span><span class="plain-syntax">[0] = </span><span class="identifier-syntax">pt1</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ems</span><span class="plain-syntax">.</span><span class="element-syntax">ops_termwise</span><span class="plain-syntax">[1] = </span><span class="identifier-syntax">pt2</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ems</span><span class="plain-syntax">.</span><span class="element-syntax">ops_termwise_opaque</span><span class="plain-syntax">[0] = </span><span class="identifier-syntax">opaque1</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ems</span><span class="plain-syntax">.</span><span class="element-syntax">ops_termwise_opaque</span><span class="plain-syntax">[1] = </span><span class="identifier-syntax">opaque2</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ems</span><span class="plain-syntax">.</span><span class="element-syntax">opaque_term_compiler</span><span class="plain-syntax"> = </span><span class="identifier-syntax">f</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">ems</span><span class="plain-syntax">.</span><span class="element-syntax">by_ref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">sch</span><span class="plain-syntax">-></span><span class="identifier-syntax">compiled</span><span class="plain-syntax">-></span><span class="identifier-syntax">dereference_mode</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> </span><span class="identifier-syntax">VH</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Holsters::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">void_context</span><span class="plain-syntax">?</span><span class="identifier-syntax">INTER_VOID_VHMODE:INTER_VAL_VHMODE</span><span class="plain-syntax">);</span>
|
||||
|
@ -170,7 +180,7 @@ the compiler is much smaller.
|
|||
<span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rule_to_which_this_is_a_response</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> when a new response is being compiled</span>
|
||||
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">response_marker_within_that_rule</span><span class="plain-syntax"> = -1; </span><span class="comment-syntax"> when a new response is being compiled</span>
|
||||
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::from_schema_token</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">CompileSchemas::from_schema_token</span></span>:<br/><a href="4-cs.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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::from_schema_token</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">CompileSchemas::from_schema_token</span></span>:<br/><a href="4-cs.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">inter_schema_token</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ems_s</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">prim_cat</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arg_L</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">i6s_emission_state</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ems</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">i6s_emission_state</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">ems_s</span><span class="plain-syntax">;</span>
|
||||
|
||||
|
@ -196,14 +206,18 @@ Here <span class="extract"><span class="extract-syntax">this</span></span> is th
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">this</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ems</span><span class="plain-syntax">-></span><span class="element-syntax">ops_termwise</span><span class="plain-syntax">[</span><span class="identifier-syntax">N</span><span class="plain-syntax">], *</span><span class="identifier-syntax">other</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ems</span><span class="plain-syntax">-></span><span class="element-syntax">ops_termwise</span><span class="plain-syntax">[1-</span><span class="identifier-syntax">N</span><span class="plain-syntax">];</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rule_to_which_this_is_a_response</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">M</span><span class="plain-syntax"> = </span><span class="identifier-syntax">response_marker_within_that_rule</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">m</span><span class="plain-syntax"> & </span><span class="identifier-syntax">ADOPT_LOCAL_STACK_FRAME_ISSBM</span><span class="plain-syntax">) &&</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">other</span><span class="plain-syntax">) &&</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">m</span><span class="plain-syntax"> & </span><span class="identifier-syntax">ADOPT_LOCAL_STACK_FRAME_ISSBM</span><span class="plain-syntax">) &&</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_CONSTANT_of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">other</span><span class="plain-syntax">-></span><span class="identifier-syntax">constant</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_response</span><span class="plain-syntax">))) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">rule_to_which_this_is_a_response</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_rule</span><span class="plain-syntax">(</span><span class="identifier-syntax">other</span><span class="plain-syntax">-></span><span class="identifier-syntax">constant</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">response_marker_within_that_rule</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_response_marker</span><span class="plain-syntax">(</span><span class="identifier-syntax">other</span><span class="plain-syntax">-></span><span class="identifier-syntax">constant</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">m</span><span class="plain-syntax"> & </span><span class="identifier-syntax">CAST_TO_KIND_OF_OTHER_TERM_ISSBM</span><span class="plain-syntax">) </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">other</span><span class="plain-syntax">-></span><span class="identifier-syntax">term_checked_as_kind</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cs.html#SP4" class="function-link"><span class="function-syntax">CompileSchemas::compile_term_of_token</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">this</span><span class="plain-syntax">, </span><span class="identifier-syntax">m</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">by_reference</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">other</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">m</span><span class="plain-syntax"> & </span><span class="identifier-syntax">CAST_TO_KIND_OF_OTHER_TERM_ISSBM</span><span class="plain-syntax">)) </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">other</span><span class="plain-syntax">-></span><span class="identifier-syntax">term_checked_as_kind</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ems</span><span class="plain-syntax">-></span><span class="element-syntax">opaque_term_compiler</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> (*(</span><span class="identifier-syntax">ems</span><span class="plain-syntax">-></span><span class="element-syntax">opaque_term_compiler</span><span class="plain-syntax">))(</span><span class="identifier-syntax">ems</span><span class="plain-syntax">-></span><span class="element-syntax">ops_termwise_opaque</span><span class="plain-syntax">[</span><span class="identifier-syntax">N</span><span class="plain-syntax">]);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cs.html#SP4" class="function-link"><span class="function-syntax">CompileSchemas::compile_term_of_token</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">this</span><span class="plain-syntax">, </span><span class="identifier-syntax">m</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">by_reference</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">rule_to_which_this_is_a_response</span><span class="plain-syntax"> = </span><span class="identifier-syntax">R</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">response_marker_within_that_rule</span><span class="plain-syntax"> = </span><span class="identifier-syntax">M</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
|
@ -217,6 +231,7 @@ both, one after the other.
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ems</span><span class="plain-syntax">-></span><span class="element-syntax">opaque_term_compiler</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"'*&' can't be compiled opaquely"</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">emit_without_combination</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">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt0</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ems</span><span class="plain-syntax">-></span><span class="element-syntax">ops_termwise</span><span class="plain-syntax">[0], *</span><span class="identifier-syntax">pt1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ems</span><span class="plain-syntax">-></span><span class="element-syntax">ops_termwise</span><span class="plain-syntax">[1];</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pt0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">)) {</span>
|
||||
|
@ -248,7 +263,7 @@ of four things can happen to the term arising from a token:
|
|||
</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">CompileSchemas::compile_term_of_token</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">CompileSchemas::compile_term_of_token</span></span>:<br/><a href="4-cs.html#SP3_1">§3.1</a>, <a href="4-cs.html#SP3_2">§3.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">m</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cast_to</span><span class="plain-syntax">,</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::compile_term_of_token</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">CompileSchemas::compile_term_of_token</span></span>:<br/><a href="4-cs.html#SP3_1">§3.1</a>, <a href="4-cs.html#SP3_2">§3.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">m</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cast_to</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">by_reference</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</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 term"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">m</span><span class="plain-syntax"> & </span><span class="identifier-syntax">GIVE_KIND_ID_ISSBM</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-cs.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Compile weak ID of the kind of this term</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
|
||||
|
@ -307,7 +322,7 @@ in an rvalue context, but also by <a href="4-cdp.html" class="internal">Compile
|
|||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::compile_term</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">CompileSchemas::compile_term</span></span>:<br/><a href="4-cs.html#SP4_3">§4.3</a><br/>Compile Deferred Propositions - <a href="4-cdp.html#SP3_6_1_4_5">§3.6.1.4.5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">by_reference</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSchemas::compile_term</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">CompileSchemas::compile_term</span></span>:<br/><a href="4-cs.html#SP4_3">§4.3</a><br/>Compile Deferred Propositions - <a href="4-cdp.html#SP3_6_1_4_5">§3.6.1.4.5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">by_reference</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">.</span><span class="identifier-syntax">variable</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-cs.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Compile variable term</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">.</span><span class="identifier-syntax">constant</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-cs.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">Compile constant term</span><span class="named-paragraph-number">5.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">.</span><span class="identifier-syntax">function</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-cs.html#SP5_3" class="named-paragraph-link"><span class="named-paragraph">Compile function term</span><span class="named-paragraph-number">5.3</span></a></span><span class="plain-syntax">;</span>
|
||||
|
|
|
@ -77,19 +77,14 @@ arithmetic is integer or floating-point.
|
|||
</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">Kinds::Compile::perform_arithmetic_emit</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">Kinds::Compile::perform_arithmetic_emit</span></span>:<br/>Compile Invocations Inline - <a href="5-cii.html#SP6_6_7">§6.6.7</a><br/>Compile Solutions to Equations - <a href="5-cste.html#SP4_1">§4.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">op</span><span class="plain-syntax">, </span><span class="identifier-syntax">equation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eqn</span><span class="plain-syntax">,</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CompileArithmetic::perform_arithmetic_emit</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">CompileArithmetic::perform_arithmetic_emit</span></span>:<br/>Compile Invocations Inline - <a href="5-cii.html#SP6_6_7">§6.6.7</a><br/>Compile Solutions to Equations - <a href="5-cste.html#SP4_1">§4.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">op</span><span class="plain-syntax">, </span><span class="identifier-syntax">equation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eqn</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">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">equation_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">EX</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KX</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">Y</span><span class="plain-syntax">, </span><span class="identifier-syntax">equation_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">EY</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KY</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">binary</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Dimensions::arithmetic_op_is_unary</span><span class="plain-syntax">(</span><span class="identifier-syntax">op</span><span class="plain-syntax">)) </span><span class="identifier-syntax">binary</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">use_fp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">promote_X</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">demote_result</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">reduce_modulo_1440</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">use_fp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">promote_X</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">demote_result</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">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KR</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::Dimensions::arithmetic_on_kinds</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</span><span class="plain-syntax">, </span><span class="identifier-syntax">op</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">KX</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">KY</span><span class="plain-syntax">)) {</span>
|
||||
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KT</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TimesOfDay::kind</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">KT</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">KR</span><span class="plain-syntax">, </span><span class="identifier-syntax">KT</span><span class="plain-syntax">))) </span><span class="identifier-syntax">reduce_modulo_1440</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">endif</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (((</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">)) ||</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">)))</span>
|
||||
<span class="plain-syntax"> && (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KR</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
|
||||
|
@ -98,35 +93,12 @@ arithmetic is integer or floating-point.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_1" class="named-paragraph-link"><span class="named-paragraph">Choose which form of arithmetic and promotion</span><span class="named-paragraph-number">1.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_2" class="named-paragraph-link"><span class="named-paragraph">Optimise promotions from number to real number</span><span class="named-paragraph-number">1.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">reduce_modulo_1440</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">NUMBER_TY_TO_TIME_TY_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">demote_result</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_deflotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KR</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">op</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">EQUALS_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_11" class="named-paragraph-link"><span class="named-paragraph">Emit set-equals</span><span class="named-paragraph-number">1.11</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PLUS_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3" class="named-paragraph-link"><span class="named-paragraph">Emit plus</span><span class="named-paragraph-number">1.3</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MINUS_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_4" class="named-paragraph-link"><span class="named-paragraph">Emit minus</span><span class="named-paragraph-number">1.4</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TIMES_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_5" class="named-paragraph-link"><span class="named-paragraph">Emit times</span><span class="named-paragraph-number">1.5</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DIVIDE_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_6" class="named-paragraph-link"><span class="named-paragraph">Emit divide</span><span class="named-paragraph-number">1.6</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">REMAINDER_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_7" class="named-paragraph-link"><span class="named-paragraph">Emit remainder</span><span class="named-paragraph-number">1.7</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">APPROXIMATION_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_8" class="named-paragraph-link"><span class="named-paragraph">Emit approximation</span><span class="named-paragraph-number">1.8</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ROOT_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_9" class="named-paragraph-link"><span class="named-paragraph">Emit root</span><span class="named-paragraph-number">1.9</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">REALROOT_OPERATION:</span><span class="plain-syntax"> </span><span class="identifier-syntax">use_fp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_9" class="named-paragraph-link"><span class="named-paragraph">Emit root</span><span class="named-paragraph-number">1.9</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CUBEROOT_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_10" class="named-paragraph-link"><span class="named-paragraph">Emit cube root</span><span class="named-paragraph-number">1.10</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">POWER_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_13" class="named-paragraph-link"><span class="named-paragraph">Emit a power of the left operand</span><span class="named-paragraph-number">1.13</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">UNARY_MINUS_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_12" class="named-paragraph-link"><span class="named-paragraph">Emit unary minus</span><span class="named-paragraph-number">1.12</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">IMPLICIT_APPLICATION_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_14" class="named-paragraph-link"><span class="named-paragraph">Emit implicit application</span><span class="named-paragraph-number">1.14</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">BelievedImpossible</span><span class="plain-syntax">),</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"this doesn't seem to be an arithmetic operation"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"suggesting a problem with some inline definition."</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</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">demote_result</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_deflotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KR</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">operand_emission_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3" class="named-paragraph-link"><span class="named-paragraph">Set up the operands</span><span class="named-paragraph-number">1.3</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_4" class="named-paragraph-link"><span class="named-paragraph">Emit the code for the operation</span><span class="named-paragraph-number">1.4</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">demote_result</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_deflotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KR</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">reduce_modulo_1440</span><span class="plain-syntax">) </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP1_1" class="paragraph-anchor"></a><b>§1.1. </b>For a binary operation, note that "pi plus pi", "pi plus 3", and "3 plus pi"
|
||||
|
@ -184,187 +156,53 @@ it as a real.
|
|||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">))) { </span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="identifier-syntax">KY</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_real_number</span><span class="plain-syntax">; }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_3" class="paragraph-anchor"></a><b>§1.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit plus</span><span class="named-paragraph-number">1.3</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_3" class="paragraph-anchor"></a><b>§1.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Set up the operands</span><span class="named-paragraph-number">1.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">REAL_NUMBER_TY_PLUS_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.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">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">PLUS_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">oed_X</span><span class="plain-syntax"> = </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::operand_data</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">EX</span><span class="plain-syntax">, </span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">promote_X</span><span class="plain-syntax">, </span><span class="identifier-syntax">eqn</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax"> = </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::operand_data</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Y</span><span class="plain-syntax">, </span><span class="identifier-syntax">EY</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</span><span class="plain-syntax">, </span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">, </span><span class="identifier-syntax">eqn</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</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">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">op</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TIMES_OPERATION:</span><span class="plain-syntax"> </span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">.</span><span class="element-syntax">rescale_multiply_K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KY</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DIVIDE_OPERATION:</span><span class="plain-syntax"> </span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">.</span><span class="element-syntax">rescale_divide_K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KY</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ROOT_OPERATION:</span><span class="plain-syntax"> </span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">.</span><span class="element-syntax">rescale_root</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CUBEROOT_OPERATION:</span><span class="plain-syntax"> </span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">.</span><span class="element-syntax">rescale_root</span><span class="plain-syntax"> = </span><span class="constant-syntax">3</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_4" class="paragraph-anchor"></a><b>§1.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit minus</span><span class="named-paragraph-number">1.4</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_4" class="paragraph-anchor"></a><b>§1.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit the code for the operation</span><span class="named-paragraph-number">1.4</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">REAL_NUMBER_TY_MINUS_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.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">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">MINUS_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">op</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">EQUALS_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_4_1" class="named-paragraph-link"><span class="named-paragraph">Emit set-equals</span><span class="named-paragraph-number">1.4.1</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">POWER_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_4_2" class="named-paragraph-link"><span class="named-paragraph">Emit a power of the left operand</span><span class="named-paragraph-number">1.4.2</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">IMPLICIT_APPLICATION_OPERATION:</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_4_3" class="named-paragraph-link"><span class="named-paragraph">Emit implicit application</span><span class="named-paragraph-number">1.4.3</span></a></span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PLUS_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MINUS_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TIMES_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DIVIDE_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">REMAINDER_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">APPROXIMATION_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ROOT_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CUBEROOT_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">UNARY_MINUS_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::compile_by_schema</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">op</span><span class="plain-syntax">, &</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">, &</span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">REALROOT_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::compile_by_schema</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ROOT_OPERATION</span><span class="plain-syntax">, &</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">, &</span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">BelievedImpossible</span><span class="plain-syntax">),</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"this doesn't seem to be an arithmetic operation"</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="string-syntax">"suggesting a problem with some inline definition."</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_5" class="paragraph-anchor"></a><b>§1.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit times</span><span class="named-paragraph-number">1.5</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">REAL_NUMBER_TY_TIMES_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.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">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_multiplication_emit_op</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">TIMES_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_multiplication_emit_factor</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_6" class="paragraph-anchor"></a><b>§1.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit divide</span><span class="named-paragraph-number">1.6</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">REAL_NUMBER_TY_DIVIDE_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.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">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTEGERDIVIDE_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_division_emit_op</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_division_emit_factor</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_7" class="paragraph-anchor"></a><b>§1.7. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit remainder</span><span class="named-paragraph-number">1.7</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">REAL_NUMBER_TY_REMAINDER_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.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">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTEGERREMAINDER_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_8" class="paragraph-anchor"></a><b>§1.8. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit approximation</span><span class="named-paragraph-number">1.8</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">REAL_NUMBER_TY_APPROXIMATE_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.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">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">ROUNDOFFVALUE_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_9" class="paragraph-anchor"></a><b>§1.9. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit root</span><span class="named-paragraph-number">1.9</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">REAL_NUMBER_TY_ROOT_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">SQUAREROOT_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_root_emit_op</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_root_emit_factor</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a> (twice).</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_10" class="paragraph-anchor"></a><b>§1.10. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit cube root</span><span class="named-paragraph-number">1.10</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">REAL_NUMBER_TY_CUBE_ROOT_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">CUBEROOT_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_root_emit_op</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="constant-syntax">3</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_root_emit_factor</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="constant-syntax">3</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_11" class="paragraph-anchor"></a><b>§1.11. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit set-equals</span><span class="named-paragraph-number">1.11</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary firstcommentary"><a id="SP1_4_1" class="paragraph-anchor"></a><b>§1.4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit set-equals</span><span class="named-paragraph-number">1.4.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
|
@ -372,63 +210,37 @@ it as a real.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::reference</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::compile_operand</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::compile_operand</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_12" class="paragraph-anchor"></a><b>§1.12. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit unary minus</span><span class="named-paragraph-number">1.12</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">REAL_NUMBER_TY_NEGATE_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">UNARYMINUS_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_13" class="paragraph-anchor"></a><b>§1.13. </b>We accomplish integer powers by repeated multiplication. This is partly
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1_4">§1.4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_4_2" class="paragraph-anchor"></a><b>§1.4.2. </b>We accomplish integer powers by repeated multiplication. This is partly
|
||||
because Inter has no "to the power of" opcode, partly because the powers involved
|
||||
will always be small, partly because of the need for scaling to come out right.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit a power of the left operand</span><span class="named-paragraph-number">1.13</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit a power of the left operand</span><span class="named-paragraph-number">1.4.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">REAL_NUMBER_TY_POW_HL</span><span class="plain-syntax">));</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.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">promote_X</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::compile_by_schema</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">op</span><span class="plain-syntax">, &</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">, &</span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">Y</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">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">EY</span><span class="plain-syntax">-></span><span class="identifier-syntax">leaf_constant</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">p</span><span class="plain-syntax"> <= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><a href="5-cste.html#SP5" class="function-link"><span class="function-syntax">EquationSolver::issue_problem_on_root</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">eqn</span><span class="plain-syntax">, </span><span class="identifier-syntax">EY</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">p</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::compile_operand</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=1; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">p</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_multiplication_emit_op</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">TIMES_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::compile_operand</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::compile_operand</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=1; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">p</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_multiplication_emit_factor</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
|
@ -436,49 +248,158 @@ will always be small, partly because of the need for scaling to come out right.
|
|||
<span class="plain-syntax"> }</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_14" class="paragraph-anchor"></a><b>§1.14. </b>This is used in equation solving only; here we are evaluating a mathematical
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1_4">§1.4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_4_3" class="paragraph-anchor"></a><b>§1.4.3. </b>This is used in equation solving only; here we are evaluating a mathematical
|
||||
function like <span class="extract"><span class="extract-syntax">log pi</span></span>, where <span class="extract"><span class="extract-syntax">X</span></span> is the function (in this case <span class="extract"><span class="extract-syntax">log</span></span>) and
|
||||
<span class="extract"><span class="extract-syntax">Y</span></span> the value (in this case <span class="extract"><span class="extract-syntax">pi</span></span>). Clearly a function cannot be promoted.
|
||||
</p>
|
||||
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit implicit application</span><span class="named-paragraph-number">1.14</span></span><span class="comment-syntax"> =</span>
|
||||
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit implicit application</span><span class="named-paragraph-number">1.4.3</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">use_fp</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">INDIRECT1_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.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">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">promote_Y</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">INDIRECT1_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_1" class="named-paragraph-link"><span class="named-paragraph">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ca.html#SP1_3_2" class="named-paragraph-link"><span class="named-paragraph">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">.</span><span class="element-syntax">promote_me</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">EmitCode::inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">INDIRECT1_BIP</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::down</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::compile_operand</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::compile_operand</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitCode::up</span><span class="plain-syntax">();</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1_4">§1.4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">operand_emission_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">X</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">equation_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">EX</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">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KX</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">equation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eqn</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">promote_me</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">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rescale_divide_K</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">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rescale_multiply_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">rescale_root</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax">} </span><span class="reserved-syntax">operand_emission_data</span><span class="plain-syntax">;</span>
|
||||
|
||||
<span class="reserved-syntax">operand_emission_data</span><span class="plain-syntax"> </span><span class="function-syntax">CompileArithmetic::operand_data</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">CompileArithmetic::operand_data</span></span>:<br/><a href="5-ca.html#SP1_3">§1.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">equation_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">EX</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">promote_me</span><span class="plain-syntax">, </span><span class="identifier-syntax">equation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eqn</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">operand_emission_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">oed</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">oed</span><span class="plain-syntax">.</span><span class="element-syntax">X</span><span class="plain-syntax"> = </span><span class="identifier-syntax">X</span><span class="plain-syntax">; </span><span class="identifier-syntax">oed</span><span class="plain-syntax">.</span><span class="element-syntax">EX</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EX</span><span class="plain-syntax">; </span><span class="identifier-syntax">oed</span><span class="plain-syntax">.</span><span class="element-syntax">KX</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KX</span><span class="plain-syntax">; </span><span class="identifier-syntax">oed</span><span class="plain-syntax">.</span><span class="element-syntax">promote_me</span><span class="plain-syntax"> = </span><span class="identifier-syntax">promote_me</span><span class="plain-syntax">; </span><span class="identifier-syntax">oed</span><span class="plain-syntax">.</span><span class="element-syntax">eqn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">eqn</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">oed</span><span class="plain-syntax">.</span><span class="element-syntax">rescale_divide_K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="identifier-syntax">oed</span><span class="plain-syntax">.</span><span class="element-syntax">rescale_multiply_K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="identifier-syntax">oed</span><span class="plain-syntax">.</span><span class="element-syntax">rescale_root</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">oed</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">CompileArithmetic::compile_by_schema</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">CompileArithmetic::compile_by_schema</span></span>:<br/><a href="5-ca.html#SP1_4">§1.4</a>, <a href="5-ca.html#SP1_4_2">§1.4.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">op</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">operand_emission_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">, </span><span class="reserved-syntax">operand_emission_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">-></span><span class="element-syntax">rescale_multiply_K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_multiplication_emit_op</span><span class="plain-syntax">(</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">prototype</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP3" class="function-link"><span class="function-syntax">CompileArithmetic::schema</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prototype</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">op</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"*1"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"*2"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"%S;"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prototype</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cs.html#SP1" class="function-link"><span class="function-syntax">CompileSchemas::with_callbacks_in_val_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> &</span><a href="5-ca.html#SP2" class="function-link"><span class="function-syntax">CompileArithmetic::compile_operand</span></a><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">prototype</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">-></span><span class="element-syntax">rescale_multiply_K</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Scalings::rescale_multiplication_emit_factor</span><span class="plain-syntax">(</span><span class="identifier-syntax">oed_X</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed_Y</span><span class="plain-syntax">-></span><span class="element-syntax">KX</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">CompileArithmetic::compile_operand</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">CompileArithmetic::compile_operand</span></span>:<br/><a href="5-ca.html#SP1_4_1">§1.4.1</a>, <a href="5-ca.html#SP1_4_2">§1.4.2</a>, <a href="5-ca.html#SP1_4_3">§1.4.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">oed_v</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">operand_emission_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">oed</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">operand_emission_data</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">oed_v</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">promote_me</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::begin_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">rescale_divide_K</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::Scalings::rescale_division_emit_op</span><span class="plain-syntax">(</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">rescale_divide_K</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">oed</span><span class="plain-syntax">-></span><span class="element-syntax">rescale_root</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::Scalings::rescale_root_emit_op</span><span class="plain-syntax">(</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">rescale_root</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">X</span><span class="plain-syntax">) </span><a href="2-cv.html#SP5" class="function-link"><span class="function-syntax">CompileValues::to_code_val_of_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="5-cste.html#SP4" class="function-link"><span class="function-syntax">EquationSolver::compile_enode</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">eqn</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">EX</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">rescale_divide_K</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::Scalings::rescale_division_emit_factor</span><span class="plain-syntax">(</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">rescale_divide_K</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">oed</span><span class="plain-syntax">-></span><span class="element-syntax">rescale_root</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::Scalings::rescale_root_emit_factor</span><span class="plain-syntax">(</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">rescale_root</span><span class="plain-syntax">);</span>
|
||||
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">promote_me</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::FloatingPoint::end_flotation_emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">oed</span><span class="plain-syntax">-></span><span class="element-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>The structure operand_emission_data is private to this section.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </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">CompileArithmetic::schema</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">CompileArithmetic::schema</span></span>:<br/><a href="5-ca.html#SP2">§2</a><br/>Compile Lvalues - <a href="2-cl.html#SP5">§5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KY</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">operation</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">Y</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">reducing_modulo_1440</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KT</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TimesOfDay::kind</span><span class="plain-syntax">();</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">KT</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">KT</span><span class="plain-syntax">))) </span><span class="identifier-syntax">reducing_modulo_1440</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">endif</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">reducing_modulo_1440</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"NUMBER_TY_to_TIME_TY("</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">operation</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PLUS_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</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">"REAL_NUMBER_TY_Plus(%S, %S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</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</span><span class="plain-syntax">(</span><span class="string-syntax">"%S + %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MINUS_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</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">"REAL_NUMBER_TY_Minus(%S, %S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</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</span><span class="plain-syntax">(</span><span class="string-syntax">"%S - %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TIMES_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</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">"REAL_NUMBER_TY_Times(%S, %S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</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</span><span class="plain-syntax">(</span><span class="string-syntax">"%S ** %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DIVIDE_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</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">"REAL_NUMBER_TY_Divide(%S, %S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</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</span><span class="plain-syntax">(</span><span class="string-syntax">"IntegerDivide(%S, %S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">REMAINDER_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</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">"REAL_NUMBER_TY_Remainder(%S, %S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</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</span><span class="plain-syntax">(</span><span class="string-syntax">"IntegerRemainder(%S, %S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">APPROXIMATION_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</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">"REAL_NUMBER_TY_Approximate(%S, %S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</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</span><span class="plain-syntax">(</span><span class="string-syntax">"RoundOffValue(%S, %S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">UNARY_MINUS_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</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">"REAL_NUMBER_TY_Negate(%S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</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</span><span class="plain-syntax">(</span><span class="string-syntax">"(-(%S))"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">REALROOT_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"REAL_NUMBER_TY_Root(%S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ROOT_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</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">"REAL_NUMBER_TY_Root(%S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</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</span><span class="plain-syntax">(</span><span class="string-syntax">"SquareRoot(%S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CUBEROOT_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</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">"REAL_NUMBER_TY_CubeRoot(%S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</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</span><span class="plain-syntax">(</span><span class="string-syntax">"CubeRoot(%S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">POWER_OPERATION:</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::uses_floating_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">KX</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">"REAL_NUMBER_TY_Pow(%S, %S)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no integer power function exists"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no schema can be provided for this operation"</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">reducing_modulo_1440</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">")"</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax">}</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_3_1" class="paragraph-anchor"></a><b>§1.3.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit the X-operand</span><span class="named-paragraph-number">1.3.1</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">X</span><span class="plain-syntax">) </span><a href="2-cv.html#SP5" class="function-link"><span class="function-syntax">CompileValues::to_code_val_of_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">KX</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="5-cste.html#SP4" class="function-link"><span class="function-syntax">EquationSolver::compile_enode</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">eqn</span><span class="plain-syntax">, </span><span class="identifier-syntax">EX</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1_3">§1.3</a> (twice), <a href="5-ca.html#SP1_4">§1.4</a> (twice), <a href="5-ca.html#SP1_5">§1.5</a> (twice), <a href="5-ca.html#SP1_6">§1.6</a> (twice), <a href="5-ca.html#SP1_7">§1.7</a> (twice), <a href="5-ca.html#SP1_8">§1.8</a> (twice), <a href="5-ca.html#SP1_9">§1.9</a> (twice), <a href="5-ca.html#SP1_10">§1.10</a> (twice), <a href="5-ca.html#SP1_11">§1.11</a>, <a href="5-ca.html#SP1_12">§1.12</a> (twice), <a href="5-ca.html#SP1_13">§1.13</a> (three times), <a href="5-ca.html#SP1_14">§1.14</a> (twice).</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP1_3_2" class="paragraph-anchor"></a><b>§1.3.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Emit the Y-operand</span><span class="named-paragraph-number">1.3.2</span></span><span class="comment-syntax"> =</span>
|
||||
</p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Y</span><span class="plain-syntax">) </span><a href="2-cv.html#SP5" class="function-link"><span class="function-syntax">CompileValues::to_code_val_of_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Y</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="5-cste.html#SP4" class="function-link"><span class="function-syntax">EquationSolver::compile_enode</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">eqn</span><span class="plain-syntax">, </span><span class="identifier-syntax">EY</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-ca.html#SP1_3">§1.3</a> (twice), <a href="5-ca.html#SP1_4">§1.4</a> (twice), <a href="5-ca.html#SP1_5">§1.5</a> (twice), <a href="5-ca.html#SP1_6">§1.6</a> (twice), <a href="5-ca.html#SP1_7">§1.7</a> (twice), <a href="5-ca.html#SP1_8">§1.8</a> (twice), <a href="5-ca.html#SP1_11">§1.11</a>, <a href="5-ca.html#SP1_13">§1.13</a>, <a href="5-ca.html#SP1_14">§1.14</a> (twice).</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
<ul class="progressbar"><li class="progressprev"><a href="5-cste.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-cv.html">2</a></li><li class="progresschapter"><a href="3-sf.html">3</a></li><li class="progresschapter"><a href="4-cs.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-cbal.html">cbal</a></li><li class="progresssection"><a href="5-ci.html">ci</a></li><li class="progresssection"><a href="5-ciac.html">ciac</a></li><li class="progresssection"><a href="5-cii.html">cii</a></li><li class="progresssection"><a href="5-cste.html">cste</a></li><li class="progresscurrent">ca</li><li class="progressnextoff">❯</li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -1623,10 +1623,12 @@ and deallocation of dynamic lists, since Y is a block value. The point of the
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">storage_class</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lvalues::get_storage_form</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">copy_form</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="5-cii.html#SP6_6_4_3" class="named-paragraph-link"><span class="named-paragraph">Check that increment or decrement make sense</span><span class="named-paragraph-number">6.6.4.3</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prototype</span><span class="plain-syntax"> = </span><a href="2-cl.html#SP4" class="function-link"><span class="function-syntax">CompileLvalues::interpret_store</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">, </span><span class="identifier-syntax">K1</span><span class="plain-syntax">, </span><span class="identifier-syntax">K2</span><span class="plain-syntax">, </span><span class="identifier-syntax">copy_form</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"%s;"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prototype</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">KIND_CHECKING</span><span class="plain-syntax">, </span><span class="string-syntax">"Inline copy: %s\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prototype</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">prototype</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><a href="2-cl.html#SP4" class="function-link"><span class="function-syntax">CompileLvalues::interpret_store</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prototype</span><span class="plain-syntax">, </span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">, </span><span class="identifier-syntax">K1</span><span class="plain-syntax">, </span><span class="identifier-syntax">K2</span><span class="plain-syntax">, </span><span class="identifier-syntax">copy_form</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"%S;"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prototype</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">KIND_CHECKING</span><span class="plain-syntax">, </span><span class="string-syntax">"Inline copy: %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prototype</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="4-cs.html#SP1" class="function-link"><span class="function-syntax">CompileSchemas::from_terms_in_val_context</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, &</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, &</span><span class="identifier-syntax">pt2</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">prototype</span><span class="plain-syntax">)</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP6_6">§6.6</a>.</li></ul>
|
||||
|
@ -1776,7 +1778,7 @@ variable matches the given description.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">Y</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">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KX</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">KY</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP6_6_7_1" class="named-paragraph-link"><span class="named-paragraph">Read the operands and their kinds</span><span class="named-paragraph-number">6.6.7.1</span></a></span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP1" class="function-link"><span class="function-syntax">Kinds::Compile::perform_arithmetic_emit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">op</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP1" class="function-link"><span class="function-syntax">CompileArithmetic::perform_arithmetic_emit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">op</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP6_6">§6.6</a>.</li></ul>
|
||||
|
|
|
@ -294,7 +294,7 @@ casting between quasinumerical kinds, we'll have to return to this.)
|
|||
</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">EquationSolver::compile_enode</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">EquationSolver::compile_enode</span></span>:<br/><a href="5-cste.html#SP3">§3</a><br/>Compile Arithmetic - <a href="5-ca.html#SP1_3_1">§1.3.1</a>, <a href="5-ca.html#SP1_3_2">§1.3.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">equation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eqn</span><span class="plain-syntax">, </span><span class="identifier-syntax">equation_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tok</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EquationSolver::compile_enode</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">EquationSolver::compile_enode</span></span>:<br/><a href="5-cste.html#SP3">§3</a><br/>Compile Arithmetic - <a href="5-ca.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">equation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eqn</span><span class="plain-syntax">, </span><span class="identifier-syntax">equation_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tok</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">a</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::FloatingPoint::is_real</span><span class="plain-syntax">(</span><span class="identifier-syntax">tok</span><span class="plain-syntax">-></span><span class="identifier-syntax">gK_before</span><span class="plain-syntax">)) </span><span class="identifier-syntax">a</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
||||
|
@ -353,14 +353,14 @@ casting between quasinumerical kinds, we'll have to return to this.)
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">KX</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_real_number</span><span class="plain-syntax">; </span><span class="identifier-syntax">KY</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_real_number</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP1" class="function-link"><span class="function-syntax">Kinds::Compile::perform_arithmetic_emit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tok</span><span class="plain-syntax">-></span><span class="identifier-syntax">eqn_operation</span><span class="plain-syntax">, </span><span class="identifier-syntax">eqn</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><a href="5-ca.html#SP1" class="function-link"><span class="function-syntax">CompileArithmetic::perform_arithmetic_emit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tok</span><span class="plain-syntax">-></span><span class="identifier-syntax">eqn_operation</span><span class="plain-syntax">, </span><span class="identifier-syntax">eqn</span><span class="plain-syntax">,</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
||||
</pre>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="5-cste.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b></p>
|
||||
|
||||
<pre class="displayed-code all-displayed-code code-font">
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EquationSolver::issue_problem_on_root</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">EquationSolver::issue_problem_on_root</span></span>:<br/>Compile Arithmetic - <a href="5-ca.html#SP1_13">§1.13</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">equation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eqn</span><span class="plain-syntax">, </span><span class="identifier-syntax">equation_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tok</span><span class="plain-syntax">) {</span>
|
||||
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">EquationSolver::issue_problem_on_root</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">EquationSolver::issue_problem_on_root</span></span>:<br/>Compile Arithmetic - <a href="5-ca.html#SP1_4_2">§1.4.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">equation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">eqn</span><span class="plain-syntax">, </span><span class="identifier-syntax">equation_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tok</span><span class="plain-syntax">) {</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">eqn</span><span class="plain-syntax">-></span><span class="identifier-syntax">equation_text</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_HardIntegerRoot</span><span class="plain-syntax">));</span>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Total memory consumption was 140603K = 137 MB
|
||||
Total memory consumption was 140609K = 137 MB
|
||||
|
||||
---- was used for 2144648 objects, in 379838 frames in 0 x 800K = 0K = 0 MB:
|
||||
---- was used for 2144723 objects, in 379913 frames in 0 x 800K = 0K = 0 MB:
|
||||
|
||||
30.0% inter_tree_node_array 60 x 8192 = 491520 objects, 43255680 bytes
|
||||
19.5% text_stream_array 5001 x 100 = 500100 objects, 28165632 bytes
|
||||
|
@ -14,7 +14,7 @@ Total memory consumption was 140603K = 137 MB
|
|||
2.4% pcalc_prop_array 26 x 1000 = 26000 objects, 3536832 bytes
|
||||
2.2% inter_name_array 68 x 1000 = 68000 objects, 3266176 bytes
|
||||
1.8% kind_array 68 x 1000 = 68000 objects, 2722176 bytes
|
||||
1.4% inter_schema_token 14189 objects, 2156728 bytes
|
||||
1.5% inter_schema_token 14235 objects, 2163720 bytes
|
||||
1.4% inter_name_generator_array 52 x 1000 = 52000 objects, 2081664 bytes
|
||||
1.3% package_request 21375 objects, 1881000 bytes
|
||||
1.2% vocabulary_entry_array 164 x 100 = 16400 objects, 1842048 bytes
|
||||
|
@ -26,7 +26,7 @@ Total memory consumption was 140603K = 137 MB
|
|||
0.7% map_data 682 objects, 1145760 bytes
|
||||
0.7% id_body 981 objects, 1122264 bytes
|
||||
0.7% adjective_meaning 210 objects, 1039920 bytes
|
||||
0.7% inter_schema_node 9080 objects, 1016960 bytes
|
||||
0.7% inter_schema_node 9103 objects, 1019536 bytes
|
||||
0.6% excerpt_meaning 3169 objects, 988728 bytes
|
||||
0.6% production 3998 objects, 927536 bytes
|
||||
0.6% ptoken 8693 objects, 904072 bytes
|
||||
|
@ -53,7 +53,7 @@ Total memory consumption was 140603K = 137 MB
|
|||
---- inference 1708 objects, 122976 bytes
|
||||
---- pcalc_term_array 3 x 1000 = 3000 objects, 120096 bytes
|
||||
---- documentation_ref 1282 objects, 112816 bytes
|
||||
---- inter_schema 1546 objects, 111312 bytes
|
||||
---- inter_schema 1552 objects, 111744 bytes
|
||||
---- imperative_defn 1419 objects, 102168 bytes
|
||||
---- noun_usage 2421 objects, 96840 bytes
|
||||
---- inter_tree 7 objects, 96264 bytes
|
||||
|
@ -262,9 +262,9 @@ Total memory consumption was 140603K = 137 MB
|
|||
---- loop_over_scope 1 object, 40 bytes
|
||||
---- i6_memory_setting 1 object, 32 bytes
|
||||
|
||||
100.0% was used for memory not allocated for objects:
|
||||
99.9% was used for memory not allocated for objects:
|
||||
|
||||
62.6% text stream storage 90147324 bytes in 520271 claims
|
||||
62.6% text stream storage 90153368 bytes in 520353 claims
|
||||
3.8% dictionary storage 5524032 bytes in 7797 claims
|
||||
---- sorting 5888 bytes in 1333 claims
|
||||
5.0% source text 7200000 bytes in 3 claims
|
||||
|
@ -282,5 +282,5 @@ Total memory consumption was 140603K = 137 MB
|
|||
---- code generation workspace for objects 3536 bytes in 19 claims
|
||||
0.2% emitter array storage 290048 bytes in 2074 claims
|
||||
|
||||
-140.-3% was overhead - -202096528 bytes = -197359K = -192 MB
|
||||
-140.-3% was overhead - -202106528 bytes = -197369K = -192 MB
|
||||
|
||||
|
|
|
@ -1,28 +1,28 @@
|
|||
100.0% in inform7 run
|
||||
67.3% in compilation to Inter
|
||||
45.7% in //Sequence::undertake_queued_tasks//
|
||||
4.3% in //MajorNodes::pre_pass//
|
||||
3.6% in //MajorNodes::pass_1//
|
||||
66.4% in compilation to Inter
|
||||
45.5% in //Sequence::undertake_queued_tasks//
|
||||
4.1% in //MajorNodes::pre_pass//
|
||||
3.3% in //MajorNodes::pass_1//
|
||||
1.8% in //ImperativeDefinitions::assess_all//
|
||||
1.4% in //RTKindConstructors::compile//
|
||||
1.4% in //RTPhrasebook::compile_entries//
|
||||
1.0% in //Sequence::lint_inter//
|
||||
0.7% in //ImperativeDefinitions::compile_first_block//
|
||||
1.1% in //Sequence::lint_inter//
|
||||
0.3% in //CompletionModule::compile//
|
||||
0.3% in //ImperativeDefinitions::compile_first_block//
|
||||
0.3% in //MajorNodes::pass_2//
|
||||
0.3% in //Sequence::undertake_queued_tasks//
|
||||
0.3% in //Sequence::undertake_queued_tasks//
|
||||
0.3% in //World::stage_V//
|
||||
5.1% not specifically accounted for
|
||||
27.1% in running Inter pipeline
|
||||
8.7% in step 14/15: generate inform6 -> auto.inf
|
||||
6.9% in step 5/15: load-binary-kits
|
||||
5.8% in step 6/15: make-synoptic-module
|
||||
5.3% not specifically accounted for
|
||||
28.3% in running Inter pipeline
|
||||
8.9% in step 14/15: generate inform6 -> auto.inf
|
||||
7.4% in step 5/15: load-binary-kits
|
||||
6.3% in step 6/15: make-synoptic-module
|
||||
1.8% in step 9/15: make-identifiers-unique
|
||||
0.3% in step 12/15: eliminate-redundant-operations
|
||||
0.3% in step 4/15: compile-splats
|
||||
0.3% in step 7/15: shorten-wiring
|
||||
0.3% in step 8/15: detect-indirect-calls
|
||||
2.2% not specifically accounted for
|
||||
5.1% in supervisor
|
||||
4.8% in supervisor
|
||||
0.4% not specifically accounted for
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "Architecture16Kit",
|
||||
"version": "10.2.0-beta+6X47"
|
||||
"version": "10.2.0-beta+6X48"
|
||||
},
|
||||
"compatibility": "16-bit",
|
||||
"kit-details": {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "Architecture32Kit",
|
||||
"version": "10.2.0-beta+6X47"
|
||||
"version": "10.2.0-beta+6X48"
|
||||
},
|
||||
"compatibility": "32-bit",
|
||||
"kit-details": {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "BasicInformKit",
|
||||
"version": "10.2.0-beta+6X47"
|
||||
"version": "10.2.0-beta+6X48"
|
||||
},
|
||||
"needs": [ {
|
||||
"need": {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "CommandParserKit",
|
||||
"version": "10.2.0-beta+6X47"
|
||||
"version": "10.2.0-beta+6X48"
|
||||
},
|
||||
"needs": [ {
|
||||
"need": {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "EnglishLanguageKit",
|
||||
"version": "10.2.0-beta+6X47"
|
||||
"version": "10.2.0-beta+6X48"
|
||||
},
|
||||
"needs": [ {
|
||||
"need": {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "WorldModelKit",
|
||||
"version": "10.2.0-beta+6X47"
|
||||
"version": "10.2.0-beta+6X48"
|
||||
},
|
||||
"needs": [ {
|
||||
"need": {
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
"header" = memory address: $00000000
|
||||
"header plus 4 bytes" = memory address: $00000004
|
||||
"address of the serial code" = memory address: $00000036
|
||||
Looking inside, I see $00000000: 47 6C 75 6C 00 03 01 02 00 07 24 00 00 09 22 00 00 09 22 00 00 01 00 00 00 00 00 3C 00 05 7B 78 FF BE 4F 8F 49 6E 66 6F 00 01 00 00 36 2E 34 33 30 2E 33 38 00 01 31 36 30 34 32 38 C1 00 00 30 "Glul??????$???"???"????????<??{x??O?Info????6.430.38??160428???0".
|
||||
At the serial code, $00000036: 31 36 30 34 32 38 "160428".
|
||||
|
||||
Welcome
|
||||
|
|
|
@ -9,5 +9,4 @@ When play begins:
|
|||
showme the header;
|
||||
showme the header plus 4 bytes;
|
||||
showme the address of the serial code;
|
||||
say "Looking inside, I see [dump of 64 bytes at the header].";
|
||||
say "At the serial code, [dump of 6 bytes at the address of the serial code].";
|
||||
|
|
|
@ -212,8 +212,10 @@ int EqualityDetails::schema(bp_family *self, int task, binary_predicate *bp, ann
|
|||
asch->schema = NULL;
|
||||
} else {
|
||||
@<Exceptional case of setting the "player" global variable@>;
|
||||
Calculus::Schemas::modify(asch->schema, "%s",
|
||||
CompileLvalues::interpret_store(storage_class, st[0], st[1], 0));
|
||||
TEMPORARY_TEXT(prototype)
|
||||
CompileLvalues::interpret_store(prototype, storage_class, st[0], st[1], 0);
|
||||
Calculus::Schemas::modify(asch->schema, "%S", prototype);
|
||||
DISCARD_TEXT(prototype)
|
||||
@<Add kind-checking code for run-time checking@>;
|
||||
}
|
||||
return TRUE;
|
||||
|
|
|
@ -251,19 +251,14 @@ change if arbitrary-precision integers are ever added to Inform, for instance.
|
|||
@ Here we supply advice on whether shallow or deep copies are needed.
|
||||
|
||||
=
|
||||
char *CompileLvalues::interpret_store(node_type_t storage_class, kind *left, kind *right, int inc) {
|
||||
void CompileLvalues::interpret_store(OUTPUT_STREAM, node_type_t storage_class,
|
||||
kind *left, kind *right, int inc) {
|
||||
LOGIF(KIND_CHECKING, "Interpreting assignment of kinds %u, %u\n", left, right);
|
||||
kind_constructor *L = NULL, *R = NULL;
|
||||
if ((left) && (right)) { L = left->construct; R = right->construct; }
|
||||
int form = STORE_WORD_TO_WORD;
|
||||
if (inc > 0) {
|
||||
form = INCREASE_BY_WORD;
|
||||
if (Kinds::FloatingPoint::uses_floating_point(left)) form = INCREASE_BY_REAL;
|
||||
}
|
||||
if (inc < 0) {
|
||||
form = DECREASE_BY_WORD;
|
||||
if (Kinds::FloatingPoint::uses_floating_point(left)) form = DECREASE_BY_REAL;
|
||||
}
|
||||
if (inc > 0) form = INCREASE_BY_WORD;
|
||||
if (inc < 0) form = DECREASE_BY_WORD;
|
||||
if (KindConstructors::uses_block_values(L)) {
|
||||
if (KindConstructors::allow_word_as_pointer(L, R)) {
|
||||
form = STORE_WORD_TO_POINTER;
|
||||
|
@ -275,12 +270,7 @@ char *CompileLvalues::interpret_store(node_type_t storage_class, kind *left, kin
|
|||
if (inc < 0) form = DECREASE_BY_POINTER;
|
||||
}
|
||||
}
|
||||
int reduce = FALSE;
|
||||
#ifdef IF_MODULE
|
||||
kind *KT = TimesOfDay::kind();
|
||||
if ((KT) && (Kinds::eq(left, KT))) reduce = TRUE;
|
||||
#endif
|
||||
return CompileLvalues::storage_schema(storage_class, form, reduce);
|
||||
CompileLvalues::storage_schema(OUT, storage_class, form, left);
|
||||
}
|
||||
|
||||
@ Which uses:
|
||||
|
@ -289,105 +279,62 @@ char *CompileLvalues::interpret_store(node_type_t storage_class, kind *left, kin
|
|||
@d STORE_WORD_TO_POINTER 2
|
||||
@d STORE_POINTER_TO_POINTER 3
|
||||
@d INCREASE_BY_WORD 4
|
||||
@d INCREASE_BY_REAL 5
|
||||
@d INCREASE_BY_POINTER 6
|
||||
@d DECREASE_BY_WORD 7
|
||||
@d DECREASE_BY_REAL 8
|
||||
@d DECREASE_BY_POINTER 9
|
||||
@d INCREASE_BY_POINTER 5
|
||||
@d DECREASE_BY_WORD 6
|
||||
@d DECREASE_BY_POINTER 7
|
||||
|
||||
=
|
||||
char *CompileLvalues::storage_schema(node_type_t storage_class, int kind_of_store,
|
||||
int reducing_modulo_1440) {
|
||||
void CompileLvalues::storage_schema(OUTPUT_STREAM, node_type_t storage_class,
|
||||
int kind_of_store, kind *K) {
|
||||
switch(kind_of_store) {
|
||||
case STORE_WORD_TO_WORD:
|
||||
switch(storage_class) {
|
||||
case LOCAL_VARIABLE_NT: return "*=-*1 = *<2";
|
||||
case NONLOCAL_VARIABLE_NT: return "*=-*1 = *<2";
|
||||
case TABLE_ENTRY_NT: return "*=-*$1(*%1,1,*<2)";
|
||||
case PROPERTY_VALUE_NT: return "*=-WriteGProperty(*|1,*<2)";
|
||||
case LIST_ENTRY_NT: return "*=-WriteLIST_OF_TY_GetItem(*%1,*<2)";
|
||||
case LOCAL_VARIABLE_NT: WRITE("%s", "*=-*1 = *<2"); break;
|
||||
case NONLOCAL_VARIABLE_NT: WRITE("%s", "*=-*1 = *<2"); break;
|
||||
case TABLE_ENTRY_NT: WRITE("%s", "*=-*$1(*%1,1,*<2)"); break;
|
||||
case PROPERTY_VALUE_NT: WRITE("%s", "*=-WriteGProperty(*|1,*<2)"); break;
|
||||
case LIST_ENTRY_NT: WRITE("%s", "*=-WriteLIST_OF_TY_GetItem(*%1,*<2)"); break;
|
||||
}
|
||||
return "";
|
||||
break;
|
||||
case STORE_WORD_TO_POINTER:
|
||||
switch(storage_class) {
|
||||
case LOCAL_VARIABLE_NT: return "*=-CastPV(*1, *#2, *2)";
|
||||
case NONLOCAL_VARIABLE_NT: return "*=-CastPV(*1, *#2, *2)";
|
||||
case TABLE_ENTRY_NT: return "*=-CastPV(*$1(*%1, 5), *#2, *2)";
|
||||
case PROPERTY_VALUE_NT: return "*=-CastPV(*+1, *#2, *2)";
|
||||
case LIST_ENTRY_NT: return "*=-CastPV(*1, *#2, *2)";
|
||||
case LOCAL_VARIABLE_NT: WRITE("%s", "*=-CastPV(*1, *#2, *2)"); break;
|
||||
case NONLOCAL_VARIABLE_NT: WRITE("%s", "*=-CastPV(*1, *#2, *2)"); break;
|
||||
case TABLE_ENTRY_NT: WRITE("%s", "*=-CastPV(*$1(*%1, 5), *#2, *2)"); break;
|
||||
case PROPERTY_VALUE_NT: WRITE("%s", "*=-CastPV(*+1, *#2, *2)"); break;
|
||||
case LIST_ENTRY_NT: WRITE("%s", "*=-CastPV(*1, *#2, *2)"); break;
|
||||
}
|
||||
return "";
|
||||
break;
|
||||
case STORE_POINTER_TO_POINTER:
|
||||
switch(storage_class) {
|
||||
case LOCAL_VARIABLE_NT: return "*=-CopyPV(*1, *<2)";
|
||||
case NONLOCAL_VARIABLE_NT: return "*=-CopyPV(*1, *<2)";
|
||||
case TABLE_ENTRY_NT: return "*=-CopyPV(*$1(*%1, 5), *<2)";
|
||||
case PROPERTY_VALUE_NT: return "*=-CopyPV(*+1, *<2)";
|
||||
case LIST_ENTRY_NT: return "*=-CopyPV(*1, *<2)";
|
||||
case LOCAL_VARIABLE_NT: WRITE("%s", "*=-CopyPV(*1, *<2)"); break;
|
||||
case NONLOCAL_VARIABLE_NT: WRITE("%s", "*=-CopyPV(*1, *<2)"); break;
|
||||
case TABLE_ENTRY_NT: WRITE("%s", "*=-CopyPV(*$1(*%1, 5), *<2)"); break;
|
||||
case PROPERTY_VALUE_NT: WRITE("%s", "*=-CopyPV(*+1, *<2)"); break;
|
||||
case LIST_ENTRY_NT: WRITE("%s", "*=-CopyPV(*1, *<2)"); break;
|
||||
}
|
||||
return "";
|
||||
break;
|
||||
case INCREASE_BY_WORD:
|
||||
if (reducing_modulo_1440) {
|
||||
switch(storage_class) {
|
||||
case LOCAL_VARIABLE_NT: return "*=-*1 = NUMBER_TY_to_TIME_TY(*1 + *<2)";
|
||||
case NONLOCAL_VARIABLE_NT: return "*=-*1 = NUMBER_TY_to_TIME_TY(*1 + *<2)";
|
||||
case TABLE_ENTRY_NT: return "*=-*$1(*%1,1,NUMBER_TY_to_TIME_TY(*1 + *<2))";
|
||||
case PROPERTY_VALUE_NT: return "*=-WriteGProperty(*|1,NUMBER_TY_to_TIME_TY(*+1 + *<2))";
|
||||
case LIST_ENTRY_NT: return "*=-WriteLIST_OF_TY_GetItem(*%1,NUMBER_TY_to_TIME_TY(*1 + *<2))";
|
||||
}
|
||||
} else {
|
||||
switch(storage_class) {
|
||||
case LOCAL_VARIABLE_NT: return "*=-*1 = *1 + *<2";
|
||||
case NONLOCAL_VARIABLE_NT: return "*=-*1 = *1 + *<2";
|
||||
case TABLE_ENTRY_NT: return "*=-*$1(*%1, 1, *1 + *<2)";
|
||||
case PROPERTY_VALUE_NT: return "*=-WriteGProperty(*|1,*+1 + *<2)";
|
||||
case LIST_ENTRY_NT: return "*=-WriteLIST_OF_TY_GetItem(*%1,*1 + *<2)";
|
||||
}
|
||||
}
|
||||
return "";
|
||||
case INCREASE_BY_REAL:
|
||||
case DECREASE_BY_WORD: {
|
||||
int close = FALSE;
|
||||
switch(storage_class) {
|
||||
case LOCAL_VARIABLE_NT: return "*=-*1 = REAL_NUMBER_TY_Plus(*1, *<2)";
|
||||
case NONLOCAL_VARIABLE_NT: return "*=-*1 = REAL_NUMBER_TY_Plus(*1, *<2)";
|
||||
case TABLE_ENTRY_NT: return "*=-*$1(*%1,1,REAL_NUMBER_TY_Plus(*1, *<2))";
|
||||
case PROPERTY_VALUE_NT: return "*=-WriteGProperty(*|1,REAL_NUMBER_TY_Plus(*+1, *<2))";
|
||||
case LIST_ENTRY_NT: return "*=-WriteLIST_OF_TY_GetItem(*%1,REAL_NUMBER_TY_Plus(*1, *<2))";
|
||||
case LOCAL_VARIABLE_NT: WRITE("%s", "*=-*1 = "); break;
|
||||
case NONLOCAL_VARIABLE_NT: WRITE("%s", "*=-*1 = "); break;
|
||||
case TABLE_ENTRY_NT: WRITE("%s", "*=-*$1(*%1,1,"); close = TRUE; break;
|
||||
case PROPERTY_VALUE_NT: WRITE("%s", "*=-WriteGProperty(*|1,"); close = TRUE; break;
|
||||
case LIST_ENTRY_NT: WRITE("%s", "*=-WriteLIST_OF_TY_GetItem(*%1,"); close = TRUE; break;
|
||||
}
|
||||
return "";
|
||||
int operation = PLUS_OPERATION;
|
||||
if (kind_of_store == DECREASE_BY_WORD) operation = MINUS_OPERATION;
|
||||
CompileArithmetic::schema(OUT, K, K, operation, I"*1", I"*<2");
|
||||
if (close) WRITE(")");
|
||||
break;
|
||||
}
|
||||
case INCREASE_BY_POINTER:
|
||||
internal_error("pointer value increments not implemented");
|
||||
return "";
|
||||
case DECREASE_BY_WORD:
|
||||
if (reducing_modulo_1440) {
|
||||
switch(storage_class) {
|
||||
case LOCAL_VARIABLE_NT: return "*=-*1 = NUMBER_TY_to_TIME_TY(*1 - *<2)";
|
||||
case NONLOCAL_VARIABLE_NT: return "*=-*1 = NUMBER_TY_to_TIME_TY(*1 - *<2)";
|
||||
case TABLE_ENTRY_NT: return "*=-*$1(*%1,1,NUMBER_TY_to_TIME_TY(*1 - *<2))";
|
||||
case PROPERTY_VALUE_NT: return "*=-WriteGProperty(*|1,NUMBER_TY_to_TIME_TY(*+1 - *<2))";
|
||||
case LIST_ENTRY_NT: return "*=-WriteLIST_OF_TY_GetItem(*%1,NUMBER_TY_to_TIME_TY(*1 - *<2))";
|
||||
}
|
||||
} else {
|
||||
switch(storage_class) {
|
||||
case LOCAL_VARIABLE_NT: return "*=-*1 = *1 - *<2";
|
||||
case NONLOCAL_VARIABLE_NT: return "*=-*1 = *1 - *<2";
|
||||
case TABLE_ENTRY_NT: return "*=-*$1(*%1,1,*1 - *<2)";
|
||||
case PROPERTY_VALUE_NT: return "*=-WriteGProperty(*|1,*+1 - *<2)";
|
||||
case LIST_ENTRY_NT: return "*=-WriteLIST_OF_TY_GetItem(*%1,*1 - *<2)";
|
||||
}
|
||||
}
|
||||
return "";
|
||||
case DECREASE_BY_REAL:
|
||||
switch(storage_class) {
|
||||
case LOCAL_VARIABLE_NT: return "*=-*1 = REAL_NUMBER_TY_Minus(*1, *<2)";
|
||||
case NONLOCAL_VARIABLE_NT: return "*=-*1 = REAL_NUMBER_TY_Minus(*1, *<2)";
|
||||
case TABLE_ENTRY_NT: return "*=-*$1(*%1,1,REAL_NUMBER_TY_Minus(*1, *<2))";
|
||||
case PROPERTY_VALUE_NT: return "*=-WriteGProperty(*|1,REAL_NUMBER_TY_Minus(*+1, *<2))";
|
||||
case LIST_ENTRY_NT: return "*=-WriteLIST_OF_TY_GetItem(*%1,REAL_NUMBER_TY_Minus(*1, *<2))";
|
||||
}
|
||||
return "";
|
||||
break;
|
||||
case DECREASE_BY_POINTER:
|
||||
internal_error("pointer value decrements not implemented");
|
||||
return "";
|
||||
break;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
|
|
@ -15,12 +15,17 @@ in several different ways.
|
|||
=
|
||||
void CompileSchemas::from_terms_in_void_context(i6_schema *sch,
|
||||
pcalc_term *pt1, pcalc_term *pt2) {
|
||||
CompileSchemas::sch_emit_inner(sch, pt1, pt2, TRUE);
|
||||
CompileSchemas::sch_emit_inner(sch, pt1, pt2, NULL, NULL, NULL, TRUE);
|
||||
}
|
||||
|
||||
void CompileSchemas::from_terms_in_val_context(i6_schema *sch,
|
||||
pcalc_term *pt1, pcalc_term *pt2) {
|
||||
CompileSchemas::sch_emit_inner(sch, pt1, pt2, FALSE);
|
||||
CompileSchemas::sch_emit_inner(sch, pt1, pt2, NULL, NULL, NULL, FALSE);
|
||||
}
|
||||
|
||||
void CompileSchemas::with_callbacks_in_val_context(i6_schema *sch,
|
||||
void *opaque1, void *opaque2, void (*f)(void *opaque)) {
|
||||
CompileSchemas::sch_emit_inner(sch, NULL, NULL, opaque1, opaque2, f, FALSE);
|
||||
}
|
||||
|
||||
void CompileSchemas::from_local_variables_in_void_context(i6_schema *sch,
|
||||
|
@ -64,11 +69,13 @@ as above), we fill in its kind.
|
|||
=
|
||||
typedef struct i6s_emission_state {
|
||||
struct pcalc_term *ops_termwise[2];
|
||||
void *ops_termwise_opaque[2];
|
||||
void (*opaque_term_compiler)(void *opaque);
|
||||
int by_ref;
|
||||
} i6s_emission_state;
|
||||
|
||||
void CompileSchemas::sch_emit_inner(i6_schema *sch, pcalc_term *pt1, pcalc_term *pt2,
|
||||
int void_context) {
|
||||
void *opaque1, void *opaque2, void (*f)(void *opaque), int void_context) {
|
||||
i6s_emission_state ems;
|
||||
if ((pt1) && (pt1->constant) && (pt1->term_checked_as_kind == NULL))
|
||||
pt1->term_checked_as_kind = Specifications::to_kind(pt1->constant);
|
||||
|
@ -76,6 +83,9 @@ void CompileSchemas::sch_emit_inner(i6_schema *sch, pcalc_term *pt1, pcalc_term
|
|||
pt2->term_checked_as_kind = Specifications::to_kind(pt2->constant);
|
||||
ems.ops_termwise[0] = pt1;
|
||||
ems.ops_termwise[1] = pt2;
|
||||
ems.ops_termwise_opaque[0] = opaque1;
|
||||
ems.ops_termwise_opaque[1] = opaque2;
|
||||
ems.opaque_term_compiler = f;
|
||||
ems.by_ref = sch->compiled->dereference_mode;
|
||||
|
||||
value_holster VH = Holsters::new(void_context?INTER_VOID_VHMODE:INTER_VAL_VHMODE);
|
||||
|
@ -117,14 +127,18 @@ Here |this| is the term in question, and |other| the other of the two.
|
|||
pcalc_term *this = ems->ops_termwise[N], *other = ems->ops_termwise[1-N];
|
||||
rule *R = rule_to_which_this_is_a_response;
|
||||
int M = response_marker_within_that_rule;
|
||||
if ((m & ADOPT_LOCAL_STACK_FRAME_ISSBM) &&
|
||||
if ((other) &&
|
||||
(m & ADOPT_LOCAL_STACK_FRAME_ISSBM) &&
|
||||
(Rvalues::is_CONSTANT_of_kind(other->constant, K_response))) {
|
||||
rule_to_which_this_is_a_response = Rvalues::to_rule(other->constant);
|
||||
response_marker_within_that_rule = Rvalues::to_response_marker(other->constant);
|
||||
}
|
||||
kind *K = NULL;
|
||||
if (m & CAST_TO_KIND_OF_OTHER_TERM_ISSBM) K = other->term_checked_as_kind;
|
||||
CompileSchemas::compile_term_of_token(this, m, K, by_reference);
|
||||
if ((other) && (m & CAST_TO_KIND_OF_OTHER_TERM_ISSBM)) K = other->term_checked_as_kind;
|
||||
if (ems->opaque_term_compiler)
|
||||
(*(ems->opaque_term_compiler))(ems->ops_termwise_opaque[N]);
|
||||
else
|
||||
CompileSchemas::compile_term_of_token(this, m, K, by_reference);
|
||||
rule_to_which_this_is_a_response = R;
|
||||
response_marker_within_that_rule = M;
|
||||
|
||||
|
@ -133,6 +147,7 @@ If that is a combination of two values then we unpack those and compile them
|
|||
both, one after the other.
|
||||
|
||||
@<Perform combine@> =
|
||||
if (ems->opaque_term_compiler) internal_error("'*&' can't be compiled opaquely");
|
||||
int emit_without_combination = TRUE;
|
||||
pcalc_term *pt0 = ems->ops_termwise[0], *pt1 = ems->ops_termwise[1];
|
||||
if ((pt0) && (pt1)) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
[Kinds::Compile::] Compile Arithmetic.
|
||||
[CompileArithmetic::] Compile Arithmetic.
|
||||
|
||||
To compile code performing an arithmetic operation.
|
||||
|
||||
|
@ -18,19 +18,14 @@ operations, and we have to manage scaling factors and whether the underlying
|
|||
arithmetic is integer or floating-point.
|
||||
|
||||
=
|
||||
void Kinds::Compile::perform_arithmetic_emit(int op, equation *eqn,
|
||||
void CompileArithmetic::perform_arithmetic_emit(int op, equation *eqn,
|
||||
parse_node *X, equation_node *EX, kind *KX,
|
||||
parse_node *Y, equation_node *EY, kind *KY) {
|
||||
int binary = TRUE;
|
||||
if (Kinds::Dimensions::arithmetic_op_is_unary(op)) binary = FALSE;
|
||||
int use_fp = FALSE, promote_X = FALSE, promote_Y = FALSE, demote_result = FALSE,
|
||||
reduce_modulo_1440 = FALSE;
|
||||
int use_fp = FALSE, promote_X = FALSE, promote_Y = FALSE, demote_result = FALSE;
|
||||
kind *KR = Kinds::Dimensions::arithmetic_on_kinds(KX, KY, op);
|
||||
if ((KX) && (KY)) {
|
||||
#ifdef IF_MODULE
|
||||
kind *KT = TimesOfDay::kind();
|
||||
if ((KT) && (Kinds::eq(KR, KT))) reduce_modulo_1440 = TRUE;
|
||||
#endif
|
||||
if (((Kinds::FloatingPoint::uses_floating_point(KX)) ||
|
||||
(Kinds::FloatingPoint::uses_floating_point(KY)))
|
||||
&& (Kinds::FloatingPoint::uses_floating_point(KR) == FALSE)
|
||||
|
@ -39,35 +34,12 @@ void Kinds::Compile::perform_arithmetic_emit(int op, equation *eqn,
|
|||
}
|
||||
@<Choose which form of arithmetic and promotion@>;
|
||||
@<Optimise promotions from number to real number@>;
|
||||
if (reduce_modulo_1440) {
|
||||
EmitCode::call(Hierarchy::find(NUMBER_TY_TO_TIME_TY_HL));
|
||||
EmitCode::down();
|
||||
}
|
||||
if (demote_result) {
|
||||
Kinds::FloatingPoint::begin_deflotation_emit(KR);
|
||||
}
|
||||
switch (op) {
|
||||
case EQUALS_OPERATION: @<Emit set-equals@>; break;
|
||||
case PLUS_OPERATION: @<Emit plus@>; break;
|
||||
case MINUS_OPERATION: @<Emit minus@>; break;
|
||||
case TIMES_OPERATION: @<Emit times@>; break;
|
||||
case DIVIDE_OPERATION: @<Emit divide@>; break;
|
||||
case REMAINDER_OPERATION: @<Emit remainder@>; break;
|
||||
case APPROXIMATION_OPERATION: @<Emit approximation@>; break;
|
||||
case ROOT_OPERATION: @<Emit root@>; break;
|
||||
case REALROOT_OPERATION: use_fp = TRUE; @<Emit root@>; break;
|
||||
case CUBEROOT_OPERATION: @<Emit cube root@>; break;
|
||||
case POWER_OPERATION: @<Emit a power of the left operand@>; break;
|
||||
case UNARY_MINUS_OPERATION: @<Emit unary minus@>; break;
|
||||
case IMPLICIT_APPLICATION_OPERATION: @<Emit implicit application@>; break;
|
||||
default:
|
||||
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
|
||||
"this doesn't seem to be an arithmetic operation",
|
||||
"suggesting a problem with some inline definition.");
|
||||
break;
|
||||
}
|
||||
|
||||
if (demote_result) Kinds::FloatingPoint::begin_deflotation_emit(KR);
|
||||
operand_emission_data oed_X, oed_Y;
|
||||
@<Set up the operands@>;
|
||||
@<Emit the code for the operation@>;
|
||||
if (demote_result) Kinds::FloatingPoint::end_deflotation_emit(KR);
|
||||
if (reduce_modulo_1440) EmitCode::up();
|
||||
}
|
||||
|
||||
@ For a binary operation, note that "pi plus pi", "pi plus 3", and "3 plus pi"
|
||||
|
@ -113,152 +85,42 @@ it as a real.
|
|||
if ((promote_X) && (Kinds::eq(KX, K_number))) { promote_X = FALSE; KX = K_real_number; }
|
||||
if ((promote_Y) && (Kinds::eq(KY, K_number))) { promote_Y = FALSE; KY = K_real_number; }
|
||||
|
||||
@<Emit plus@> =
|
||||
if (use_fp) {
|
||||
EmitCode::call(Hierarchy::find(REAL_NUMBER_TY_PLUS_HL));
|
||||
EmitCode::down();
|
||||
if (promote_X) Kinds::FloatingPoint::begin_flotation_emit(KX);
|
||||
@<Emit the X-operand@>;
|
||||
if (promote_X) Kinds::FloatingPoint::end_flotation_emit(KX);
|
||||
if (promote_Y) Kinds::FloatingPoint::begin_flotation_emit(KY);
|
||||
@<Emit the Y-operand@>;
|
||||
if (promote_Y) Kinds::FloatingPoint::end_flotation_emit(KY);
|
||||
EmitCode::up();
|
||||
} else {
|
||||
EmitCode::inv(PLUS_BIP);
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
@<Emit the Y-operand@>;
|
||||
EmitCode::up();
|
||||
@<Set up the operands@> =
|
||||
oed_X = CompileArithmetic::operand_data(X, EX, KX, promote_X, eqn);
|
||||
oed_Y = CompileArithmetic::operand_data(Y, EY, KY, promote_Y, eqn);
|
||||
if (use_fp == FALSE) {
|
||||
switch (op) {
|
||||
case TIMES_OPERATION: oed_X.rescale_multiply_K = KY; break;
|
||||
case DIVIDE_OPERATION: oed_X.rescale_divide_K = KY; break;
|
||||
case ROOT_OPERATION: oed_X.rescale_root = 2; break;
|
||||
case CUBEROOT_OPERATION: oed_X.rescale_root = 3; break;
|
||||
}
|
||||
}
|
||||
|
||||
@<Emit minus@> =
|
||||
if (use_fp) {
|
||||
EmitCode::call(Hierarchy::find(REAL_NUMBER_TY_MINUS_HL));
|
||||
EmitCode::down();
|
||||
if (promote_X) Kinds::FloatingPoint::begin_flotation_emit(KX);
|
||||
@<Emit the X-operand@>;
|
||||
if (promote_X) Kinds::FloatingPoint::end_flotation_emit(KX);
|
||||
if (promote_Y) Kinds::FloatingPoint::begin_flotation_emit(KY);
|
||||
@<Emit the Y-operand@>;
|
||||
if (promote_Y) Kinds::FloatingPoint::end_flotation_emit(KY);
|
||||
EmitCode::up();
|
||||
} else {
|
||||
EmitCode::inv(MINUS_BIP);
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
@<Emit the Y-operand@>;
|
||||
EmitCode::up();
|
||||
}
|
||||
|
||||
@<Emit times@> =
|
||||
if (use_fp) {
|
||||
EmitCode::call(Hierarchy::find(REAL_NUMBER_TY_TIMES_HL));
|
||||
EmitCode::down();
|
||||
if (promote_X) Kinds::FloatingPoint::begin_flotation_emit(KX);
|
||||
@<Emit the X-operand@>;
|
||||
if (promote_X) Kinds::FloatingPoint::end_flotation_emit(KX);
|
||||
if (promote_Y) Kinds::FloatingPoint::begin_flotation_emit(KY);
|
||||
@<Emit the Y-operand@>;
|
||||
if (promote_Y) Kinds::FloatingPoint::end_flotation_emit(KY);
|
||||
EmitCode::up();
|
||||
} else {
|
||||
Kinds::Scalings::rescale_multiplication_emit_op(KX, KY);
|
||||
EmitCode::inv(TIMES_BIP);
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
@<Emit the Y-operand@>;
|
||||
EmitCode::up();
|
||||
Kinds::Scalings::rescale_multiplication_emit_factor(KX, KY);
|
||||
}
|
||||
|
||||
@<Emit divide@> =
|
||||
if (use_fp) {
|
||||
EmitCode::call(Hierarchy::find(REAL_NUMBER_TY_DIVIDE_HL));
|
||||
EmitCode::down();
|
||||
if (promote_X) Kinds::FloatingPoint::begin_flotation_emit(KX);
|
||||
@<Emit the X-operand@>;
|
||||
if (promote_X) Kinds::FloatingPoint::end_flotation_emit(KX);
|
||||
if (promote_Y) Kinds::FloatingPoint::begin_flotation_emit(KY);
|
||||
@<Emit the Y-operand@>;
|
||||
if (promote_Y) Kinds::FloatingPoint::end_flotation_emit(KY);
|
||||
EmitCode::up();
|
||||
} else {
|
||||
EmitCode::call(Hierarchy::find(INTEGERDIVIDE_HL));
|
||||
EmitCode::down();
|
||||
Kinds::Scalings::rescale_division_emit_op(KX, KY);
|
||||
@<Emit the X-operand@>;
|
||||
Kinds::Scalings::rescale_division_emit_factor(KX, KY);
|
||||
@<Emit the Y-operand@>;
|
||||
EmitCode::up();
|
||||
}
|
||||
|
||||
@<Emit remainder@> =
|
||||
if (use_fp) {
|
||||
EmitCode::call(Hierarchy::find(REAL_NUMBER_TY_REMAINDER_HL));
|
||||
EmitCode::down();
|
||||
if (promote_X) Kinds::FloatingPoint::begin_flotation_emit(KX);
|
||||
@<Emit the X-operand@>;
|
||||
if (promote_X) Kinds::FloatingPoint::end_flotation_emit(KX);
|
||||
if (promote_Y) Kinds::FloatingPoint::begin_flotation_emit(KY);
|
||||
@<Emit the Y-operand@>;
|
||||
if (promote_Y) Kinds::FloatingPoint::end_flotation_emit(KY);
|
||||
EmitCode::up();
|
||||
} else {
|
||||
EmitCode::call(Hierarchy::find(INTEGERREMAINDER_HL));
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
@<Emit the Y-operand@>;
|
||||
EmitCode::up();
|
||||
}
|
||||
|
||||
@<Emit approximation@> =
|
||||
if (use_fp) {
|
||||
EmitCode::call(Hierarchy::find(REAL_NUMBER_TY_APPROXIMATE_HL));
|
||||
EmitCode::down();
|
||||
if (promote_X) Kinds::FloatingPoint::begin_flotation_emit(KX);
|
||||
@<Emit the X-operand@>;
|
||||
if (promote_X) Kinds::FloatingPoint::end_flotation_emit(KX);
|
||||
if (promote_Y) Kinds::FloatingPoint::begin_flotation_emit(KY);
|
||||
@<Emit the Y-operand@>;
|
||||
if (promote_Y) Kinds::FloatingPoint::end_flotation_emit(KY);
|
||||
EmitCode::up();
|
||||
} else {
|
||||
EmitCode::call(Hierarchy::find(ROUNDOFFVALUE_HL));
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
@<Emit the Y-operand@>;
|
||||
EmitCode::up();
|
||||
}
|
||||
|
||||
@<Emit root@> =
|
||||
if (use_fp) {
|
||||
EmitCode::call(Hierarchy::find(REAL_NUMBER_TY_ROOT_HL));
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
EmitCode::up();
|
||||
} else {
|
||||
EmitCode::call(Hierarchy::find(SQUAREROOT_HL));
|
||||
EmitCode::down();
|
||||
Kinds::Scalings::rescale_root_emit_op(KX, 2);
|
||||
@<Emit the X-operand@>;
|
||||
Kinds::Scalings::rescale_root_emit_factor(KX, 2);
|
||||
EmitCode::up();
|
||||
}
|
||||
|
||||
@<Emit cube root@> =
|
||||
if (use_fp) {
|
||||
EmitCode::call(Hierarchy::find(REAL_NUMBER_TY_CUBE_ROOT_HL));
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
EmitCode::up();
|
||||
} else {
|
||||
EmitCode::call(Hierarchy::find(CUBEROOT_HL));
|
||||
EmitCode::down();
|
||||
Kinds::Scalings::rescale_root_emit_op(KX, 3);
|
||||
@<Emit the X-operand@>;
|
||||
Kinds::Scalings::rescale_root_emit_factor(KX, 3);
|
||||
EmitCode::up();
|
||||
@<Emit the code for the operation@> =
|
||||
switch (op) {
|
||||
case EQUALS_OPERATION: @<Emit set-equals@>; break;
|
||||
case POWER_OPERATION: @<Emit a power of the left operand@>; break;
|
||||
case IMPLICIT_APPLICATION_OPERATION: @<Emit implicit application@>; break;
|
||||
case PLUS_OPERATION:
|
||||
case MINUS_OPERATION:
|
||||
case TIMES_OPERATION:
|
||||
case DIVIDE_OPERATION:
|
||||
case REMAINDER_OPERATION:
|
||||
case APPROXIMATION_OPERATION:
|
||||
case ROOT_OPERATION:
|
||||
case CUBEROOT_OPERATION:
|
||||
case UNARY_MINUS_OPERATION:
|
||||
CompileArithmetic::compile_by_schema(op, &oed_X, &oed_Y);
|
||||
break;
|
||||
case REALROOT_OPERATION:
|
||||
CompileArithmetic::compile_by_schema(ROOT_OPERATION, &oed_X, &oed_Y);
|
||||
break;
|
||||
default:
|
||||
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),
|
||||
"this doesn't seem to be an arithmetic operation",
|
||||
"suggesting a problem with some inline definition.");
|
||||
break;
|
||||
}
|
||||
|
||||
@<Emit set-equals@> =
|
||||
|
@ -266,54 +128,32 @@ it as a real.
|
|||
EmitCode::down();
|
||||
EmitCode::reference();
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
CompileArithmetic::compile_operand(&oed_X);
|
||||
EmitCode::up();
|
||||
if (promote_Y) Kinds::FloatingPoint::begin_flotation_emit(KY);
|
||||
@<Emit the Y-operand@>;
|
||||
if (promote_Y) Kinds::FloatingPoint::end_flotation_emit(KY);
|
||||
CompileArithmetic::compile_operand(&oed_Y);
|
||||
EmitCode::up();
|
||||
|
||||
@<Emit unary minus@> =
|
||||
if (use_fp) {
|
||||
EmitCode::call(Hierarchy::find(REAL_NUMBER_TY_NEGATE_HL));
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
EmitCode::up();
|
||||
} else {
|
||||
EmitCode::inv(UNARYMINUS_BIP);
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
EmitCode::up();
|
||||
}
|
||||
|
||||
@ We accomplish integer powers by repeated multiplication. This is partly
|
||||
because Inter has no "to the power of" opcode, partly because the powers involved
|
||||
will always be small, partly because of the need for scaling to come out right.
|
||||
|
||||
@<Emit a power of the left operand@> =
|
||||
if (use_fp) {
|
||||
EmitCode::call(Hierarchy::find(REAL_NUMBER_TY_POW_HL));
|
||||
EmitCode::down();
|
||||
if (promote_X) Kinds::FloatingPoint::begin_flotation_emit(KX);
|
||||
@<Emit the X-operand@>;
|
||||
if (promote_X) Kinds::FloatingPoint::end_flotation_emit(KX);
|
||||
if (promote_Y) Kinds::FloatingPoint::begin_flotation_emit(KY);
|
||||
@<Emit the Y-operand@>;
|
||||
if (promote_Y) Kinds::FloatingPoint::end_flotation_emit(KY);
|
||||
EmitCode::up();
|
||||
CompileArithmetic::compile_by_schema(op, &oed_X, &oed_Y);
|
||||
} else {
|
||||
int p = 0;
|
||||
if (Y) p = Rvalues::to_int(Y);
|
||||
else p = Rvalues::to_int(EY->leaf_constant);
|
||||
if (p <= 0) EquationSolver::issue_problem_on_root(eqn, EY);
|
||||
else if (p == 1) CompileArithmetic::compile_operand(&oed_X);
|
||||
else {
|
||||
for (int i=1; i<p; i++) {
|
||||
Kinds::Scalings::rescale_multiplication_emit_op(KX, KX);
|
||||
EmitCode::inv(TIMES_BIP);
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
CompileArithmetic::compile_operand(&oed_X);
|
||||
}
|
||||
@<Emit the X-operand@>;
|
||||
CompileArithmetic::compile_operand(&oed_X);
|
||||
for (int i=1; i<p; i++) {
|
||||
EmitCode::up();
|
||||
Kinds::Scalings::rescale_multiplication_emit_factor(KX, KX);
|
||||
|
@ -326,26 +166,142 @@ function like |log pi|, where |X| is the function (in this case |log|) and
|
|||
|Y| the value (in this case |pi|). Clearly a function cannot be promoted.
|
||||
|
||||
@<Emit implicit application@> =
|
||||
if (use_fp) {
|
||||
EmitCode::inv(INDIRECT1_BIP);
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
if (promote_Y) Kinds::FloatingPoint::begin_flotation_emit(KY);
|
||||
@<Emit the Y-operand@>;
|
||||
if (promote_Y) Kinds::FloatingPoint::end_flotation_emit(KY);
|
||||
EmitCode::up();
|
||||
} else {
|
||||
EmitCode::inv(INDIRECT1_BIP);
|
||||
EmitCode::down();
|
||||
@<Emit the X-operand@>;
|
||||
@<Emit the Y-operand@>;
|
||||
EmitCode::up();
|
||||
oed_X.promote_me = FALSE;
|
||||
EmitCode::inv(INDIRECT1_BIP);
|
||||
EmitCode::down();
|
||||
CompileArithmetic::compile_operand(&oed_X);
|
||||
CompileArithmetic::compile_operand(&oed_Y);
|
||||
EmitCode::up();
|
||||
|
||||
@
|
||||
|
||||
=
|
||||
typedef struct operand_emission_data {
|
||||
struct parse_node *X;
|
||||
struct equation_node *EX;
|
||||
struct kind *KX;
|
||||
struct equation *eqn;
|
||||
int promote_me;
|
||||
struct kind *rescale_divide_K;
|
||||
struct kind *rescale_multiply_K;
|
||||
int rescale_root;
|
||||
} operand_emission_data;
|
||||
|
||||
operand_emission_data CompileArithmetic::operand_data(parse_node *X, equation_node *EX,
|
||||
kind *KX, int promote_me, equation *eqn) {
|
||||
operand_emission_data oed;
|
||||
oed.X = X; oed.EX = EX; oed.KX = KX; oed.promote_me = promote_me; oed.eqn = eqn;
|
||||
oed.rescale_divide_K = NULL; oed.rescale_multiply_K = NULL; oed.rescale_root = 0;
|
||||
return oed;
|
||||
}
|
||||
|
||||
void CompileArithmetic::compile_by_schema(int op,
|
||||
operand_emission_data *oed_X, operand_emission_data *oed_Y) {
|
||||
if (oed_X->rescale_multiply_K)
|
||||
Kinds::Scalings::rescale_multiplication_emit_op(oed_X->KX, oed_Y->KX);
|
||||
TEMPORARY_TEXT(prototype)
|
||||
CompileArithmetic::schema(prototype, oed_X->KX, oed_Y->KX, op, I"*1", I"*2");
|
||||
i6_schema *sch = Calculus::Schemas::new("%S;", prototype);
|
||||
CompileSchemas::with_callbacks_in_val_context(sch, oed_X, oed_Y,
|
||||
&CompileArithmetic::compile_operand);
|
||||
DISCARD_TEXT(prototype)
|
||||
if (oed_X->rescale_multiply_K)
|
||||
Kinds::Scalings::rescale_multiplication_emit_factor(oed_X->KX, oed_Y->KX);
|
||||
}
|
||||
|
||||
void CompileArithmetic::compile_operand(void *oed_v) {
|
||||
operand_emission_data *oed = (operand_emission_data *) oed_v;
|
||||
if (oed->promote_me) Kinds::FloatingPoint::begin_flotation_emit(oed->KX);
|
||||
|
||||
if (oed->rescale_divide_K) Kinds::Scalings::rescale_division_emit_op(oed->KX, oed->rescale_divide_K);
|
||||
else if (oed->rescale_root) Kinds::Scalings::rescale_root_emit_op(oed->KX, oed->rescale_root);
|
||||
|
||||
if (oed->X) CompileValues::to_code_val_of_kind(oed->X, oed->KX);
|
||||
else EquationSolver::compile_enode(oed->eqn, oed->EX);
|
||||
|
||||
if (oed->rescale_divide_K) Kinds::Scalings::rescale_division_emit_factor(oed->KX, oed->rescale_divide_K);
|
||||
else if (oed->rescale_root) Kinds::Scalings::rescale_root_emit_factor(oed->KX, oed->rescale_root);
|
||||
|
||||
if (oed->promote_me) Kinds::FloatingPoint::end_flotation_emit(oed->KX);
|
||||
}
|
||||
|
||||
@
|
||||
|
||||
=
|
||||
void CompileArithmetic::schema(OUTPUT_STREAM, kind *KX, kind *KY,
|
||||
int operation, text_stream *X, text_stream *Y) {
|
||||
int reducing_modulo_1440 = FALSE;
|
||||
#ifdef IF_MODULE
|
||||
kind *KT = TimesOfDay::kind();
|
||||
if ((KT) && (Kinds::eq(KX, KT))) reducing_modulo_1440 = TRUE;
|
||||
#endif
|
||||
if (reducing_modulo_1440) WRITE("NUMBER_TY_to_TIME_TY(");
|
||||
switch (operation) {
|
||||
case PLUS_OPERATION:
|
||||
if (Kinds::FloatingPoint::uses_floating_point(KX))
|
||||
WRITE("REAL_NUMBER_TY_Plus(%S, %S)", X, Y);
|
||||
else
|
||||
WRITE("%S + %S", X, Y);
|
||||
break;
|
||||
case MINUS_OPERATION:
|
||||
if (Kinds::FloatingPoint::uses_floating_point(KX))
|
||||
WRITE("REAL_NUMBER_TY_Minus(%S, %S)", X, Y);
|
||||
else
|
||||
WRITE("%S - %S", X, Y);
|
||||
break;
|
||||
case TIMES_OPERATION:
|
||||
if (Kinds::FloatingPoint::uses_floating_point(KX))
|
||||
WRITE("REAL_NUMBER_TY_Times(%S, %S)", X, Y);
|
||||
else
|
||||
WRITE("%S ** %S", X, Y);
|
||||
break;
|
||||
case DIVIDE_OPERATION:
|
||||
if (Kinds::FloatingPoint::uses_floating_point(KX))
|
||||
WRITE("REAL_NUMBER_TY_Divide(%S, %S)", X, Y);
|
||||
else
|
||||
WRITE("IntegerDivide(%S, %S)", X, Y);
|
||||
break;
|
||||
case REMAINDER_OPERATION:
|
||||
if (Kinds::FloatingPoint::uses_floating_point(KX))
|
||||
WRITE("REAL_NUMBER_TY_Remainder(%S, %S)", X, Y);
|
||||
else
|
||||
WRITE("IntegerRemainder(%S, %S)", X, Y);
|
||||
break;
|
||||
case APPROXIMATION_OPERATION:
|
||||
if (Kinds::FloatingPoint::uses_floating_point(KX))
|
||||
WRITE("REAL_NUMBER_TY_Approximate(%S, %S)", X, Y);
|
||||
else
|
||||
WRITE("RoundOffValue(%S, %S)", X, Y);
|
||||
break;
|
||||
case UNARY_MINUS_OPERATION:
|
||||
if (Kinds::FloatingPoint::uses_floating_point(KX))
|
||||
WRITE("REAL_NUMBER_TY_Negate(%S)", X);
|
||||
else
|
||||
WRITE("(-(%S))", X);
|
||||
break;
|
||||
case REALROOT_OPERATION:
|
||||
WRITE("REAL_NUMBER_TY_Root(%S)", X);
|
||||
break;
|
||||
case ROOT_OPERATION:
|
||||
if (Kinds::FloatingPoint::uses_floating_point(KX))
|
||||
WRITE("REAL_NUMBER_TY_Root(%S)", X);
|
||||
else
|
||||
WRITE("SquareRoot(%S)", X);
|
||||
break;
|
||||
case CUBEROOT_OPERATION:
|
||||
if (Kinds::FloatingPoint::uses_floating_point(KX))
|
||||
WRITE("REAL_NUMBER_TY_CubeRoot(%S)", X);
|
||||
else
|
||||
WRITE("CubeRoot(%S)", X);
|
||||
break;
|
||||
case POWER_OPERATION:
|
||||
if (Kinds::FloatingPoint::uses_floating_point(KX))
|
||||
WRITE("REAL_NUMBER_TY_Pow(%S, %S)", X, Y);
|
||||
else
|
||||
internal_error("no integer power function exists");
|
||||
break;
|
||||
default:
|
||||
internal_error("no schema can be provided for this operation");
|
||||
}
|
||||
|
||||
@<Emit the X-operand@> =
|
||||
if (X) CompileValues::to_code_val_of_kind(X, KX);
|
||||
else EquationSolver::compile_enode(eqn, EX);
|
||||
|
||||
@<Emit the Y-operand@> =
|
||||
if (Y) CompileValues::to_code_val_of_kind(Y, KY);
|
||||
else EquationSolver::compile_enode(eqn, EY);
|
||||
if (reducing_modulo_1440) WRITE(")");
|
||||
}
|
||||
|
|
|
@ -1222,10 +1222,12 @@ and deallocation of dynamic lists, since Y is a block value. The point of the
|
|||
kind *K2 = Specifications::to_kind(from);
|
||||
node_type_t storage_class = Lvalues::get_storage_form(to);
|
||||
if (copy_form != 0) @<Check that increment or decrement make sense@>;
|
||||
char *prototype = CompileLvalues::interpret_store(storage_class, K1, K2, copy_form);
|
||||
i6_schema *sch = Calculus::Schemas::new("%s;", prototype);
|
||||
LOGIF(KIND_CHECKING, "Inline copy: %s\n", prototype);
|
||||
TEMPORARY_TEXT(prototype)
|
||||
CompileLvalues::interpret_store(prototype, storage_class, K1, K2, copy_form);
|
||||
i6_schema *sch = Calculus::Schemas::new("%S;", prototype);
|
||||
LOGIF(KIND_CHECKING, "Inline copy: %S\n", prototype);
|
||||
CompileSchemas::from_terms_in_val_context(sch, &pt1, &pt2);
|
||||
DISCARD_TEXT(prototype)
|
||||
return;
|
||||
|
||||
@ If the |from| part is prefaced with a plus sign |+|, the new value is added
|
||||
|
@ -1344,7 +1346,7 @@ variable matches the given description.
|
|||
parse_node *X = NULL, *Y = NULL;
|
||||
kind *KX = NULL, *KY = NULL;
|
||||
@<Read the operands and their kinds@>;
|
||||
Kinds::Compile::perform_arithmetic_emit(op, NULL, X, NULL, KX, Y, NULL, KY);
|
||||
CompileArithmetic::perform_arithmetic_emit(op, NULL, X, NULL, KX, Y, NULL, KY);
|
||||
return;
|
||||
|
||||
@<Read the operands and their kinds@> =
|
||||
|
|
|
@ -257,7 +257,7 @@ void EquationSolver::compile_enode(equation *eqn, equation_node *tok) {
|
|||
KX = K_real_number; KY = K_real_number;
|
||||
}
|
||||
|
||||
Kinds::Compile::perform_arithmetic_emit(tok->eqn_operation, eqn,
|
||||
CompileArithmetic::perform_arithmetic_emit(tok->eqn_operation, eqn,
|
||||
NULL, X, KX, NULL, Y, KY);
|
||||
|
||||
@ =
|
||||
|
|
Loading…
Reference in a new issue