1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-17 06:24:24 +03:00
inform7/docs/core-module/12-is.html
2019-04-18 01:53:27 +01:00

537 lines
75 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>12/ap</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '12/is' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#12">Chapter 12: Use of Propositions</a></li><li><b>I6 Schemas</b></li></ul><p class="purpose">To create, and later expand upon, short prototypes of I6 syntax for such run-time tasks as the setting, unsetting or testing of a relation.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP4">&#167;4. Building schemas</a></li><li><a href="#SP5">&#167;5. Emptiness</a></li><li><a href="#SP6">&#167;6. Expansion</a></li><li><a href="#SP10">&#167;10. Logging schemas</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>An I6 schema is an intermediate-level code for the final stages of
compiling to Inform 6 syntax. Its "prototype" is a C string encoded as
ISO Latin-1, in which the asterisk <code class="display"><span class="extract">*</span></code> acts as an escape character.
</p>
<p class="inwebparagraph">"Expanding" an I6 schema is essentially a form of macro expansion. A caller
supplies us with a schema and a number of parameters, each of which is either
a literal piece of text or a predicate calculus term. We then copy the schema's
prototype into the output, except as specified:
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(1) <code class="display"><span class="extract">**</span></code> expands to a literal asterisk.
</li></ul>
<ul class="items"><li>(2) <code class="display"><span class="extract">*1</span></code>, <code class="display"><span class="extract">*2</span></code>, ..., <code class="display"><span class="extract">*9</span></code> expands to the 1st to 9th parameter, where a literal
text parameter is copied straight through, whereas a term parameter is compiled
as a value. Expanding a parameter which was not supplied does nothing, but is
not an error.
<ul class="items"><li>(a) The modifier <code class="display"><span class="extract">!</span></code>, as in <code class="display"><span class="extract">*!1</span></code> to <code class="display"><span class="extract">*!9</span></code>, enables the use of local
variables in any text substitutions compiled in the course of the term.
</li><li>(b) The modifier <code class="display"><span class="extract">#</span></code>, as in <code class="display"><span class="extract">*#1</span></code> to <code class="display"><span class="extract">*#9</span></code>, causes us to expand to the
ID number of the kind of value of the parameter, not to the parameter itself.
(If the parameter is literal text rather than a term, we do nothing.)
</li></ul>
</li></ul>
<p class="inwebparagraph"></p>
<ul class="items"><li>(3) <code class="display"><span class="extract">*=-</span></code> and <code class="display"><span class="extract">*=+</span></code> turn "dereference pointers" mode off and on, respectively.
This has effect only when compiling a value whose content is stored on the
heap; Inform ordinarily compiles this by making a new copy of the value and
using a pointer to it, but if "dereference pointers" is off then the pointer
to the original data is used instead. It's a sort of macro-expansion version
of the difference between call-by-value and call-by-reference. The effect lasts
only while the expander is running; when the expander finishes, it restores the
mode to its setting at the start.
</li></ul>
<ul class="items"><li>(4) <code class="display"><span class="extract">*##</span></code> is reserved for the use of higher-level code in building schemas &mdash;
it has to do with locations of data on the heap &mdash; but is not strictly speaking
legal in a schema. Attempting to expand it will cause an internal error.
</li></ul>
<p class="inwebparagraph">Any other occurrence of an asterisk is illegal, and will throw an internal
error.
</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The I6 schema structure is very simple, then:
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">TYPICAL_I6_SCHEMA_LENGTH</span><span class="plain"> 128 </span> <span class="comment">in fact 40 is plenty</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">i6_schema</span><span class="plain"> {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">prototype_storage</span><span class="plain">[</span><span class="constant">TYPICAL_I6_SCHEMA_LENGTH</span><span class="plain">];</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> </span><span class="identifier">prototype</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">compiled</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_quoted_inames</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">quoted_inames</span><span class="plain">[2];</span>
<span class="plain">} </span><span class="reserved">i6_schema</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure i6_schema is private to this section.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Building schemas. </b>The following makes up a new schema from a <code class="display"><span class="extract">printf</span></code>-style formatted string:
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_I6_SCHEMA_ATTEMPT</span><span class="plain"> 1024 </span> <span class="comment">plenty of room for conjectural schema overruns</span>
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unique_qi_counter</span><span class="plain"> = 0;</span>
<span class="reserved">i6_schema</span><span class="plain"> *</span><span class="functiontext">Calculus::Schemas::new</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">fmt</span><span class="plain">, ...) {</span>
<span class="identifier">va_list</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">; </span> <span class="comment">the variable argument list signified by the dots</span>
<span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain">);</span>
<span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype</span><span class="plain"> = </span><span class="identifier">Streams::new_buffer</span><span class="plain">(</span><span class="constant">TYPICAL_I6_SCHEMA_LENGTH</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype_storage</span><span class="plain">);</span>
<span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;no_quoted_inames</span><span class="plain"> = 0;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = &amp;(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Process the varargs into schema prototype text</span> <span class="cwebmacronumber">4.3</span>&gt;<span class="plain">;</span>
<span class="identifier">va_end</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">); </span> <span class="comment">macro to end variable argument processing</span>
<span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;compiled</span><span class="plain"> = </span><span class="functiontext">InterSchemas::from_i6s</span><span class="plain">(&amp;(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype</span><span class="plain">), </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;no_quoted_inames</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;quoted_inames</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">sch</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Schemas::new is used in 6/rlt (<a href="6-rlt.html#SP9">&#167;9</a>, <a href="6-rlt.html#SP9_6">&#167;9.6</a>, <a href="6-rlt.html#SP9_7">&#167;9.7</a>, <a href="6-rlt.html#SP9_8">&#167;9.8</a>, <a href="6-rlt.html#SP9_9">&#167;9.9</a>, <a href="6-rlt.html#SP9_10">&#167;9.10</a>, <a href="6-rlt.html#SP9_11">&#167;9.11</a>, <a href="6-rlt.html#SP9_12">&#167;9.12</a>, <a href="6-rlt.html#SP9_13">&#167;9.13</a>, <a href="6-rlt.html#SP9_14">&#167;9.14</a>, <a href="6-rlt.html#SP9_15">&#167;9.15</a>), 12/qr (<a href="12-qr.html#SP3">&#167;3</a>), 12/ca (<a href="12-ca.html#SP8">&#167;8</a>), 15/ma (<a href="15-ma.html#SP14_1">&#167;14.1</a>), 15/spr (<a href="15-spr.html#SP2">&#167;2</a>), 15/spr2 (<a href="15-spr2.html#SP8">&#167;8</a>), 19/lr (<a href="19-lr.html#SP2">&#167;2</a>), 24/sf (<a href="24-sf.html#SP15">&#167;15</a>), 25/cii (<a href="25-cii.html#SP3_5_4">&#167;3.5.4</a>).</p>
<p class="inwebparagraph"><a id="SP4_1"></a><b>&#167;4.1. </b>And this is a variation for modifying an existing schema:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::modify</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">fmt</span><span class="plain">, ...) {</span>
<span class="identifier">va_list</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">; </span> <span class="comment">the variable argument list signified by the dots</span>
<span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype</span><span class="plain"> = </span><span class="identifier">Streams::new_buffer</span><span class="plain">(</span><span class="constant">TYPICAL_I6_SCHEMA_LENGTH</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype_storage</span><span class="plain">);</span>
<span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;no_quoted_inames</span><span class="plain"> = 0;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = &amp;(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Process the varargs into schema prototype text</span> <span class="cwebmacronumber">4.3</span>&gt;<span class="plain">;</span>
<span class="identifier">va_end</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">); </span> <span class="comment">macro to end variable argument processing</span>
<span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;compiled</span><span class="plain"> = </span><span class="functiontext">InterSchemas::from_i6s</span><span class="plain">(&amp;(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype</span><span class="plain">), </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;no_quoted_inames</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;quoted_inames</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Schemas::modify is used in 4/am (<a href="4-am.html#SP17">&#167;17</a>, <a href="4-am.html#SP18">&#167;18</a>, <a href="4-am.html#SP29_1">&#167;29.1</a>), 5/ins (<a href="5-ins.html#SP38_3">&#167;38.3</a>), 6/bp (<a href="6-bp.html#SP44_1">&#167;44.1</a>, <a href="6-bp.html#SP44_2">&#167;44.2</a>), 6/tur (<a href="6-tur.html#SP7">&#167;7</a>), 12/ter (<a href="12-ter.html#SP8">&#167;8</a>, <a href="12-ter.html#SP8_1">&#167;8.1</a>, <a href="12-ter.html#SP8_2">&#167;8.2</a>, <a href="12-ter.html#SP8_3">&#167;8.3</a>), 12/qr (<a href="12-qr.html#SP7">&#167;7</a>), 12/ca (<a href="12-ca.html#SP6">&#167;6</a>, <a href="12-ca.html#SP6_1">&#167;6.1</a>, <a href="12-ca.html#SP6_2">&#167;6.2</a>, <a href="12-ca.html#SP6_3">&#167;6.3</a>, <a href="12-ca.html#SP6_4">&#167;6.4</a>, <a href="12-ca.html#SP6_5">&#167;6.5</a>), 12/dtd (<a href="12-dtd.html#SP24">&#167;24</a>), 12/cdp (<a href="12-cdp.html#SP5">&#167;5</a>), 15/ep (<a href="15-ep.html#SP15_1">&#167;15.1</a>, <a href="15-ep.html#SP15_2">&#167;15.2</a>), 15/tpr (<a href="15-tpr.html#SP7">&#167;7</a>, <a href="15-tpr.html#SP7_1">&#167;7.1</a>, <a href="15-tpr.html#SP7_2">&#167;7.2</a>), 15/ma (<a href="15-ma.html#SP12">&#167;12</a>), 15/cr (<a href="15-cr.html#SP7_1">&#167;7.1</a>), 15/spr2 (<a href="15-spr2.html#SP11">&#167;11</a>), 16/ic (<a href="16-ic.html#SP15">&#167;15</a>), 23/abrp (<a href="23-abrp.html#SP2">&#167;2</a>), 23/abrc (<a href="23-abrc.html#SP2">&#167;2</a>), 23/abp (<a href="23-abp.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP4_2"></a><b>&#167;4.2. </b>And another:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::append</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">fmt</span><span class="plain">, ...) {</span>
<span class="identifier">va_list</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">; </span> <span class="comment">the variable argument list signified by the dots</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = &amp;(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Process the varargs into schema prototype text</span> <span class="cwebmacronumber">4.3</span>&gt;<span class="plain">;</span>
<span class="identifier">va_end</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">); </span> <span class="comment">macro to end variable argument processing</span>
<span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;compiled</span><span class="plain"> = </span><span class="functiontext">InterSchemas::from_i6s</span><span class="plain">(&amp;(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype</span><span class="plain">), </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;no_quoted_inames</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;quoted_inames</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Schemas::append is used in 12/ter (<a href="12-ter.html#SP8_6">&#167;8.6</a>).</p>
<p class="inwebparagraph"><a id="SP4_3"></a><b>&#167;4.3. </b>Either way, the schema's prototype is written as follows:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Process the varargs into schema prototype text</span> <span class="cwebmacronumber">4.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">;</span>
<span class="identifier">va_start</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">, </span><span class="identifier">fmt</span><span class="plain">); </span> <span class="comment">macro to begin variable argument processing</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">fmt</span><span class="plain">; *</span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">p</span><span class="plain">++) {</span>
<span class="reserved">switch</span><span class="plain"> (*</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'%'</span><span class="plain">: </span>&lt;<span class="cwebmacro">Recognise schema-format escape sequences</span> <span class="cwebmacronumber">4.3.1</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">PUT</span><span class="plain">(*</span><span class="identifier">p</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>, <a href="#SP4_1">&#167;4.1</a>, <a href="#SP4_2">&#167;4.2</a>.</p>
<p class="inwebparagraph"><a id="SP4_3_1"></a><b>&#167;4.3.1. </b>We recognise only a few escapes here: <code class="display"><span class="extract">%%</span></code>, a literal percentage sign; <code class="display"><span class="extract">%d</span></code>,
an integer; <code class="display"><span class="extract">%s</span></code>, a C string; <code class="display"><span class="extract">%S</span></code>, a text stream; and <code class="display"><span class="extract">%k</span></code>, a kind ID.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Recognise schema-format escape sequences</span> <span class="cwebmacronumber">4.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">p</span><span class="plain">++;</span>
<span class="reserved">switch</span><span class="plain"> (*</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'d'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">va_arg</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">int</span><span class="plain">)); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'k'</span><span class="plain">: </span><span class="functiontext">Kinds::RunTime::compile_weak_id</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">va_arg</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *)); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'L'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%~L"</span><span class="plain">, </span><span class="identifier">va_arg</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">local_variable</span><span class="plain"> *)); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'n'</span><span class="plain">: {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = (</span><span class="reserved">inter_name</span><span class="plain"> *) </span><span class="identifier">va_arg</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">inter_name</span><span class="plain"> *);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;no_quoted_inames</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &gt;= 2) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"too many inter_name quotes"</span><span class="plain">);</span>
<span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;quoted_inames</span><span class="plain">[</span><span class="identifier">N</span><span class="plain">] = </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"QUOTED_INAME_%d_%08x"</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">unique_qi_counter</span><span class="plain">++);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'N'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%N"</span><span class="plain">, </span><span class="identifier">va_arg</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">int</span><span class="plain">)); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'s'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s"</span><span class="plain">, </span><span class="identifier">va_arg</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *)); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'S'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">va_arg</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *)); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'%'</span><span class="plain">: </span><span class="identifier">PUT</span><span class="plain">(</span><span class="character">'%'</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="identifier">fprintf</span><span class="plain">(</span><span class="identifier">stderr</span><span class="plain">, </span><span class="string">"*** Bad schema format: &lt;%s&gt; ***\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">fmt</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Unknown % string escape in schema format"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4_3">&#167;4.3</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Emptiness. </b>A schema is empty if its prototype is the null string.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::empty</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sch</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(&amp;(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype</span><span class="plain">)) == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Schemas::empty is used in 4/am (<a href="4-am.html#SP29">&#167;29</a>, <a href="4-am.html#SP39_1">&#167;39.1</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Expansion. </b>We provide two routines as a sort of API for expanding schemas. The user can
either specify two parameters, both of them terms...
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::emit_expand_from_terms</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">,</span>
<span class="reserved">pcalc_term</span><span class="plain"> *</span><span class="identifier">pt1</span><span class="plain">, </span><span class="reserved">pcalc_term</span><span class="plain"> *</span><span class="identifier">pt2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">semicolon</span><span class="plain">) {</span>
<span class="reserved">i6s_emission_state</span><span class="plain"> </span><span class="identifier">ems</span><span class="plain"> = </span><span class="functiontext">Calculus::Schemas::state</span><span class="plain">(</span><span class="identifier">pt1</span><span class="plain">, </span><span class="identifier">pt2</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Calculus::Schemas::sch_emit_inner</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, &amp;</span><span class="identifier">ems</span><span class="plain">, </span><span class="identifier">semicolon</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::emit_expand_from_locals</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">,</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v1</span><span class="plain">, </span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">semicolon</span><span class="plain">) {</span>
<span class="reserved">pcalc_term</span><span class="plain"> </span><span class="identifier">pt1</span><span class="plain"> = </span><span class="functiontext">Calculus::Terms::new_constant</span><span class="plain">(</span>
<span class="functiontext">Lvalues::new_LOCAL_VARIABLE</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">v1</span><span class="plain">));</span>
<span class="reserved">pcalc_term</span><span class="plain"> </span><span class="identifier">pt2</span><span class="plain"> = </span><span class="functiontext">Calculus::Terms::new_constant</span><span class="plain">(</span>
<span class="functiontext">Lvalues::new_LOCAL_VARIABLE</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">));</span>
<span class="functiontext">Calculus::Schemas::emit_expand_from_terms</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, &amp;</span><span class="identifier">pt1</span><span class="plain">, &amp;</span><span class="identifier">pt2</span><span class="plain">, </span><span class="identifier">semicolon</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::emit_val_expand_from_locals</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">,</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v1</span><span class="plain">, </span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v2</span><span class="plain">) {</span>
<span class="reserved">pcalc_term</span><span class="plain"> </span><span class="identifier">pt1</span><span class="plain"> = </span><span class="functiontext">Calculus::Terms::new_constant</span><span class="plain">(</span>
<span class="functiontext">Lvalues::new_LOCAL_VARIABLE</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">v1</span><span class="plain">));</span>
<span class="reserved">pcalc_term</span><span class="plain"> </span><span class="identifier">pt2</span><span class="plain"> = </span><span class="functiontext">Calculus::Terms::new_constant</span><span class="plain">(</span>
<span class="functiontext">Lvalues::new_LOCAL_VARIABLE</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">));</span>
<span class="functiontext">Calculus::Schemas::emit_val_expand_from_terms</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, &amp;</span><span class="identifier">pt1</span><span class="plain">, &amp;</span><span class="identifier">pt2</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::emit_val_expand_from_terms</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">,</span>
<span class="reserved">pcalc_term</span><span class="plain"> *</span><span class="identifier">pt1</span><span class="plain">, </span><span class="reserved">pcalc_term</span><span class="plain"> *</span><span class="identifier">pt2</span><span class="plain">) {</span>
<span class="reserved">i6s_emission_state</span><span class="plain"> </span><span class="identifier">ems</span><span class="plain"> = </span><span class="functiontext">Calculus::Schemas::state</span><span class="plain">(</span><span class="identifier">pt1</span><span class="plain">, </span><span class="identifier">pt2</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Calculus::Schemas::sch_emit_inner</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, &amp;</span><span class="identifier">ems</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">i6s_emission_state</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">ops_textual</span><span class="plain">[2];</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pcalc_term</span><span class="plain"> *</span><span class="identifier">ops_termwise</span><span class="plain">[2];</span>
<span class="plain">} </span><span class="reserved">i6s_emission_state</span><span class="plain">;</span>
<span class="reserved">i6s_emission_state</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::state</span><span class="plain">(</span><span class="reserved">pcalc_term</span><span class="plain"> *</span><span class="identifier">pt1</span><span class="plain">, </span><span class="reserved">pcalc_term</span><span class="plain"> *</span><span class="identifier">pt2</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">str1</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">str2</span><span class="plain">) {</span>
<span class="reserved">i6s_emission_state</span><span class="plain"> </span><span class="identifier">ems</span><span class="plain">;</span>
<span class="identifier">ems</span><span class="element">.ops_textual</span><span class="plain">[0] = </span><span class="identifier">str1</span><span class="plain">;</span>
<span class="identifier">ems</span><span class="element">.ops_textual</span><span class="plain">[1] = </span><span class="identifier">str2</span><span class="plain">;</span>
<span class="identifier">ems</span><span class="element">.ops_termwise</span><span class="plain">[0] = </span><span class="identifier">pt1</span><span class="plain">;</span>
<span class="identifier">ems</span><span class="element">.ops_termwise</span><span class="plain">[1] = </span><span class="identifier">pt2</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ems</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Schemas::emit_expand_from_terms is used in 4/am (<a href="4-am.html#SP39_1">&#167;39.1</a>), 11/tr (<a href="11-tr.html#SP10">&#167;10</a>), 12/ca (<a href="12-ca.html#SP5_2">&#167;5.2</a>), 12/cdp (<a href="12-cdp.html#SP5">&#167;5</a>), 24/sf (<a href="24-sf.html#SP15">&#167;15</a>), 25/cii (<a href="25-cii.html#SP3_5_4">&#167;3.5.4</a>).</p>
<p class="endnote">The function Calculus::Schemas::emit_expand_from_locals is used in 6/rlt (<a href="6-rlt.html#SP15_2_2">&#167;15.2.2</a>, <a href="6-rlt.html#SP15_2_3">&#167;15.2.3</a>, <a href="6-rlt.html#SP15_2_9_1">&#167;15.2.9.1</a>, <a href="6-rlt.html#SP15_2_10_1">&#167;15.2.10.1</a>, <a href="6-rlt.html#SP15_2_12_1">&#167;15.2.12.1</a>, <a href="6-rlt.html#SP29_5">&#167;29.5</a>, <a href="6-rlt.html#SP29_6">&#167;29.6</a>), 12/dtd (<a href="12-dtd.html#SP23">&#167;23</a>).</p>
<p class="endnote">The function Calculus::Schemas::emit_val_expand_from_locals is used in 6/rlt (<a href="6-rlt.html#SP15_2_4">&#167;15.2.4</a>, <a href="6-rlt.html#SP29_2">&#167;29.2</a>, <a href="6-rlt.html#SP29_3">&#167;29.3</a>, <a href="6-rlt.html#SP29_4">&#167;29.4</a>).</p>
<p class="endnote">The function Calculus::Schemas::emit_val_expand_from_terms appears nowhere else.</p>
<p class="endnote">The function Calculus::Schemas::state appears nowhere else.</p>
<p class="endnote">The structure i6s_emission_state is private to this section.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::sch_emit_inner</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">, </span><span class="reserved">i6s_emission_state</span><span class="plain"> *</span><span class="identifier">ems</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">code_mode</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_textual</span><span class="plain">[0]) || (</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_textual</span><span class="plain">[1])) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Zap"</span><span class="plain">);</span>
<span class="functiontext">Calculus::Schemas::sch_type_parameter</span><span class="plain">(</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[0]);</span>
<span class="functiontext">Calculus::Schemas::sch_type_parameter</span><span class="plain">(</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[1]);</span>
<span class="constant">BEGIN_COMPILATION_MODE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;compiled</span><span class="plain">-</span><span class="element">&gt;dereference_mode</span><span class="plain">)</span>
<span class="identifier">COMPILATION_MODE_EXIT</span><span class="plain">(</span><span class="constant">DEREFERENCE_POINTERS_CMODE</span><span class="plain">);</span>
<span class="reserved">value_holster</span><span class="plain"> </span><span class="identifier">VH</span><span class="plain"> = </span><span class="functiontext">Holsters::new</span><span class="plain">(</span><span class="constant">INTER_VAL_VHMODE</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">val_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">code_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">val_mode</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="functiontext">InterSchemas::emit</span><span class="plain">(&amp;</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;compiled</span><span class="plain">, </span><span class="identifier">ems</span><span class="plain">, </span><span class="identifier">code_mode</span><span class="plain">, </span><span class="identifier">val_mode</span><span class="plain">,</span>
<span class="plain">&amp;</span><span class="functiontext">Calculus::Schemas::sch_inline</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="constant">END_COMPILATION_MODE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::sch_inline</span><span class="plain">(</span><span class="reserved">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">,</span>
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ems_s</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">prim_cat</span><span class="plain">) {</span>
<span class="reserved">i6s_emission_state</span><span class="plain"> *</span><span class="identifier">ems</span><span class="plain"> = (</span><span class="reserved">i6s_emission_state</span><span class="plain"> *) </span><span class="identifier">ems_s</span><span class="plain">;</span>
<span class="constant">BEGIN_COMPILATION_MODE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">give_kind_id</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">give_comparison_routine</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">,</span>
<span class="identifier">dereference_property</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">adopt_local_stack_frame</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">,</span>
<span class="identifier">cast_to_kind_of_other_term</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">by_reference</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_modifiers</span><span class="plain"> &amp; </span><span class="constant">PERMIT_LOCALS_IN_TEXT_CMODE_ISSBM</span><span class="plain">)</span>
<span class="identifier">COMPILATION_MODE_ENTER</span><span class="plain">(</span><span class="constant">PERMIT_LOCALS_IN_TEXT_CMODE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_modifiers</span><span class="plain"> &amp; </span><span class="constant">TREAT_AS_LVALUE_CMODE_ISSBM</span><span class="plain">)</span>
<span class="identifier">COMPILATION_MODE_ENTER</span><span class="plain">(</span><span class="constant">TREAT_AS_LVALUE_CMODE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_modifiers</span><span class="plain"> &amp; </span><span class="constant">JUST_ROUTINE_CMODE_ISSBM</span><span class="plain">)</span>
<span class="identifier">COMPILATION_MODE_ENTER</span><span class="plain">(</span><span class="constant">JUST_ROUTINE_CMODE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_modifiers</span><span class="plain"> &amp; </span><span class="constant">GIVE_KIND_ID_ISSBM</span><span class="plain">) </span><span class="identifier">give_kind_id</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_modifiers</span><span class="plain"> &amp; </span><span class="constant">GIVE_COMPARISON_ROUTINE_ISSBM</span><span class="plain">) </span><span class="identifier">give_comparison_routine</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_modifiers</span><span class="plain"> &amp; </span><span class="constant">DEREFERENCE_PROPERTY_ISSBM</span><span class="plain">) </span><span class="identifier">dereference_property</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_modifiers</span><span class="plain"> &amp; </span><span class="constant">ADOPT_LOCAL_STACK_FRAME_ISSBM</span><span class="plain">) </span><span class="identifier">adopt_local_stack_frame</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_modifiers</span><span class="plain"> &amp; </span><span class="constant">CAST_TO_KIND_OF_OTHER_TERM_ISSBM</span><span class="plain">) </span><span class="identifier">cast_to_kind_of_other_term</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_modifiers</span><span class="plain"> &amp; </span><span class="constant">BY_REFERENCE_ISSBM</span><span class="plain">) </span><span class="identifier">by_reference</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_command</span><span class="plain"> == </span><span class="constant">substitute_ISINC</span><span class="plain">) </span>&lt;<span class="cwebmacro">Perform substitution</span> <span class="cwebmacronumber">7.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_command</span><span class="plain"> == </span><span class="constant">current_sentence_ISINC</span><span class="plain">) </span>&lt;<span class="cwebmacro">Perform current sentence</span> <span class="cwebmacronumber">7.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;inline_command</span><span class="plain"> == </span><span class="constant">combine_ISINC</span><span class="plain">) </span>&lt;<span class="cwebmacro">Perform combine</span> <span class="cwebmacronumber">7.3</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unimplemented command in schema"</span><span class="plain">);</span>
<span class="constant">END_COMPILATION_MODE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Schemas::sch_emit_inner is used in <a href="#SP6">&#167;6</a>.</p>
<p class="endnote">The function Calculus::Schemas::sch_inline appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform substitution</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;constant_number</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> 0: {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cast_to_kind_of_other_term</span><span class="plain">) </span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[1]-</span><span class="element">&gt;term_checked_as_kind</span><span class="plain">;</span>
<span class="functiontext">Calculus::Schemas::sch_emit_parameter</span><span class="plain">(</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[0], </span><span class="identifier">give_kind_id</span><span class="plain">,</span>
<span class="identifier">give_comparison_routine</span><span class="plain">, </span><span class="identifier">dereference_property</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">by_reference</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> 1: {</span>
<span class="reserved">rule</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">adopted_rule_for_compilation</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">M</span><span class="plain"> = </span><span class="identifier">adopted_marker_for_compilation</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">adopt_local_stack_frame</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[0]-</span><span class="element">&gt;constant</span><span class="plain">, </span><span class="identifier">K_response</span><span class="plain">))) {</span>
<span class="identifier">adopted_rule_for_compilation</span><span class="plain"> =</span>
<span class="functiontext">Rvalues::to_rule</span><span class="plain">(</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[0]-</span><span class="element">&gt;constant</span><span class="plain">);</span>
<span class="identifier">adopted_marker_for_compilation</span><span class="plain"> =</span>
<span class="functiontext">Strings::get_marker_from_response_spec</span><span class="plain">(</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[0]-</span><span class="element">&gt;constant</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cast_to_kind_of_other_term</span><span class="plain">) </span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[0]-</span><span class="element">&gt;term_checked_as_kind</span><span class="plain">;</span>
<span class="functiontext">Calculus::Schemas::sch_emit_parameter</span><span class="plain">(</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[1],</span>
<span class="identifier">give_kind_id</span><span class="plain">, </span><span class="identifier">give_comparison_routine</span><span class="plain">, </span><span class="identifier">dereference_property</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">by_reference</span><span class="plain">);</span>
<span class="identifier">adopted_rule_for_compilation</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">;</span>
<span class="identifier">adopted_marker_for_compilation</span><span class="plain"> = </span><span class="identifier">M</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"schemas are currently limited to *1 and *2"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform current sentence</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Seems possible after all"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_3"></a><b>&#167;7.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform combine</span> <span class="cwebmacronumber">7.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">epar</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[0]) &amp;&amp; (</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[1])) {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">reln_K</span><span class="plain"> = </span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[0]-</span><span class="element">&gt;term_checked_as_kind</span><span class="plain">;</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">comb_K</span><span class="plain"> = </span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[1]-</span><span class="element">&gt;term_checked_as_kind</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">reln_K</span><span class="plain">) == </span><span class="identifier">CON_relation</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">comb_K</span><span class="plain">) == </span><span class="identifier">CON_combination</span><span class="plain">)) {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">req_A</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">req_B</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">found_A</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">found_B</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">Kinds::binary_construction_material</span><span class="plain">(</span><span class="identifier">reln_K</span><span class="plain">, &amp;</span><span class="identifier">req_A</span><span class="plain">, &amp;</span><span class="identifier">req_B</span><span class="plain">);</span>
<span class="identifier">Kinds::binary_construction_material</span><span class="plain">(</span><span class="identifier">comb_K</span><span class="plain">, &amp;</span><span class="identifier">found_A</span><span class="plain">, &amp;</span><span class="identifier">found_B</span><span class="plain">);</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec_A</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">spec_B</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="functiontext">Rvalues::to_pair</span><span class="plain">(</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[1]-</span><span class="element">&gt;constant</span><span class="plain">, &amp;</span><span class="identifier">spec_A</span><span class="plain">, &amp;</span><span class="identifier">spec_B</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (!((</span><span class="identifier">Kinds::Behaviour::uses_pointer_values</span><span class="plain">(</span><span class="identifier">req_A</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">Kinds::Behaviour::definite</span><span class="plain">(</span><span class="identifier">req_A</span><span class="plain">))))</span>
<span class="identifier">req_A</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (!((</span><span class="identifier">Kinds::Behaviour::uses_pointer_values</span><span class="plain">(</span><span class="identifier">req_B</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">Kinds::Behaviour::definite</span><span class="plain">(</span><span class="identifier">req_B</span><span class="plain">))))</span>
<span class="identifier">req_B</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="functiontext">Specifications::Compiler::emit_to_kind</span><span class="plain">(</span><span class="identifier">spec_A</span><span class="plain">, </span><span class="identifier">req_A</span><span class="plain">);</span>
<span class="functiontext">Specifications::Compiler::emit_to_kind</span><span class="plain">(</span><span class="identifier">spec_B</span><span class="plain">, </span><span class="identifier">req_B</span><span class="plain">);</span>
<span class="identifier">epar</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">epar</span><span class="plain">) {</span>
<span class="functiontext">Calculus::Schemas::sch_emit_parameter</span><span class="plain">(</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">&gt;ops_termwise</span><span class="plain">[1],</span>
<span class="identifier">give_kind_id</span><span class="plain">, </span><span class="identifier">give_comparison_routine</span><span class="plain">, </span><span class="identifier">dereference_property</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext">Emit::val</span><span class="plain">(</span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::sch_emit_parameter</span><span class="plain">(</span><span class="reserved">pcalc_term</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">give_kind_id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">give_comparison_routine</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dereference_property</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">cast_to</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">by_reference</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">give_kind_id</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pt</span><span class="plain">) </span><span class="functiontext">Kinds::RunTime::emit_weak_id_as_val</span><span class="plain">(</span><span class="identifier">pt</span><span class="plain">-</span><span class="element">&gt;term_checked_as_kind</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">give_comparison_routine</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">cr</span><span class="plain"> = (</span><span class="identifier">pt</span><span class="plain">)?(</span><span class="identifier">Kinds::Behaviour::get_comparison_routine_as_iname</span><span class="plain">(</span><span class="identifier">pt</span><span class="plain">-</span><span class="element">&gt;term_checked_as_kind</span><span class="plain">)):</span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cr</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">cr</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">SIGNEDCOMPARE_HL</span><span class="plain">);</span>
<span class="functiontext">Emit::val_iname</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">cr</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">by_reference</span><span class="plain">) {</span>
<span class="constant">BEGIN_COMPILATION_MODE</span><span class="plain">;</span>
<span class="identifier">COMPILATION_MODE_EXIT</span><span class="plain">(</span><span class="constant">DEREFERENCE_POINTERS_CMODE</span><span class="plain">);</span>
<span class="reserved">pcalc_term</span><span class="plain"> </span><span class="identifier">cpt</span><span class="plain"> = *</span><span class="identifier">pt</span><span class="plain">;</span>
<span class="functiontext">Calculus::Terms::emit</span><span class="plain">(</span><span class="identifier">cpt</span><span class="plain">);</span>
<span class="constant">END_COMPILATION_MODE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">down</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="functiontext">Kinds::RunTime::emit_cast_call</span><span class="plain">(</span><span class="identifier">pt</span><span class="plain">-</span><span class="element">&gt;term_checked_as_kind</span><span class="plain">, </span><span class="identifier">cast_to</span><span class="plain">, &amp;</span><span class="identifier">down</span><span class="plain">);</span>
<span class="reserved">pcalc_term</span><span class="plain"> </span><span class="identifier">cpt</span><span class="plain"> = *</span><span class="identifier">pt</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">dereference_property</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">cpt</span><span class="element">.constant</span><span class="plain">, </span><span class="constant">CONSTANT_NT</span><span class="plain">))) {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">cpt</span><span class="element">.constant</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">CON_property</span><span class="plain">)</span>
<span class="identifier">cpt</span><span class="plain"> = </span><span class="functiontext">Calculus::Terms::new_constant</span><span class="plain">(</span>
<span class="functiontext">Lvalues::new_PROPERTY_VALUE</span><span class="plain">(</span>
<span class="identifier">ParseTree::duplicate</span><span class="plain">(</span><span class="identifier">cpt</span><span class="element">.constant</span><span class="plain">),</span>
<span class="functiontext">Rvalues::new_self_object_constant</span><span class="plain">()));</span>
<span class="plain">}</span>
<span class="functiontext">Calculus::Terms::emit</span><span class="plain">(</span><span class="identifier">cpt</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">down</span><span class="plain">) </span><span class="functiontext">Emit::up</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Schemas::sch_emit_parameter is used in <a href="#SP7_1">&#167;7.1</a>, <a href="#SP7_3">&#167;7.3</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Last and very much least: in case we receive an untypechecked term, we fill
in its kind.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::sch_type_parameter</span><span class="plain">(</span><span class="reserved">pcalc_term</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pt</span><span class="plain">) &amp;&amp; (</span><span class="identifier">pt</span><span class="plain">-</span><span class="element">&gt;constant</span><span class="plain">) &amp;&amp; (</span><span class="identifier">pt</span><span class="plain">-</span><span class="element">&gt;term_checked_as_kind</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="identifier">pt</span><span class="plain">-</span><span class="element">&gt;term_checked_as_kind</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">pt</span><span class="plain">-</span><span class="element">&gt;constant</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Schemas::sch_type_parameter is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Logging schemas. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::log</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sch</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"&lt;null schema&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"&lt;schema: %S&gt;"</span><span class="plain">, &amp;(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Calculus::Schemas::log_applied</span><span class="plain">(</span><span class="reserved">i6_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">, </span><span class="reserved">pcalc_term</span><span class="plain"> *</span><span class="identifier">pt1</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sch</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"&lt;null schema&gt;"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"&lt;%S : $0&gt;"</span><span class="plain">, &amp;(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;prototype</span><span class="plain">), </span><span class="identifier">pt1</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Calculus::Schemas::log is used in 1/cm (<a href="1-cm.html#SP5">&#167;5</a>, <a href="1-cm.html#SP6_6">&#167;6.6</a>).</p>
<p class="endnote">The function Calculus::Schemas::log_applied is used in 11/tr (<a href="11-tr.html#SP11">&#167;11</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="12-ap.html">Back to 'Assert Propositions'</a></li><li><a href="12-ca.html">Continue with 'Compile Atoms'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>