mirror of
https://github.com/ganelson/inform.git
synced 2024-07-17 06:24:24 +03:00
537 lines
75 KiB
HTML
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">★</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">§1. Definitions</a></li><li><a href="#SP4">§4. Building schemas</a></li><li><a href="#SP5">§5. Emptiness</a></li><li><a href="#SP6">§6. Expansion</a></li><li><a href="#SP10">§10. Logging schemas</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§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 —
|
|
it has to do with locations of data on the heap — 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>§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>§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">>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">>prototype_storage</span><span class="plain">);</span>
|
|
<span class="identifier">sch</span><span class="plain">-</span><span class="element">>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"> = &(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>prototype</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Process the varargs into schema prototype text</span> <span class="cwebmacronumber">4.3</span>><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">>compiled</span><span class="plain"> = </span><span class="functiontext">InterSchemas::from_i6s</span><span class="plain">(&(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>prototype</span><span class="plain">), </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>no_quoted_inames</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>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">§9</a>, <a href="6-rlt.html#SP9_6">§9.6</a>, <a href="6-rlt.html#SP9_7">§9.7</a>, <a href="6-rlt.html#SP9_8">§9.8</a>, <a href="6-rlt.html#SP9_9">§9.9</a>, <a href="6-rlt.html#SP9_10">§9.10</a>, <a href="6-rlt.html#SP9_11">§9.11</a>, <a href="6-rlt.html#SP9_12">§9.12</a>, <a href="6-rlt.html#SP9_13">§9.13</a>, <a href="6-rlt.html#SP9_14">§9.14</a>, <a href="6-rlt.html#SP9_15">§9.15</a>), 12/qr (<a href="12-qr.html#SP3">§3</a>), 12/ca (<a href="12-ca.html#SP8">§8</a>), 15/ma (<a href="15-ma.html#SP14_1">§14.1</a>), 15/spr (<a href="15-spr.html#SP2">§2</a>), 15/spr2 (<a href="15-spr2.html#SP8">§8</a>), 19/lr (<a href="19-lr.html#SP2">§2</a>), 24/sf (<a href="24-sf.html#SP15">§15</a>), 25/cii (<a href="25-cii.html#SP3_5_4">§3.5.4</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_1"></a><b>§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">>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">>prototype_storage</span><span class="plain">);</span>
|
|
<span class="identifier">sch</span><span class="plain">-</span><span class="element">>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"> = &(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>prototype</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Process the varargs into schema prototype text</span> <span class="cwebmacronumber">4.3</span>><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">>compiled</span><span class="plain"> = </span><span class="functiontext">InterSchemas::from_i6s</span><span class="plain">(&(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>prototype</span><span class="plain">), </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>no_quoted_inames</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>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">§17</a>, <a href="4-am.html#SP18">§18</a>, <a href="4-am.html#SP29_1">§29.1</a>), 5/ins (<a href="5-ins.html#SP38_3">§38.3</a>), 6/bp (<a href="6-bp.html#SP44_1">§44.1</a>, <a href="6-bp.html#SP44_2">§44.2</a>), 6/tur (<a href="6-tur.html#SP7">§7</a>), 12/ter (<a href="12-ter.html#SP8">§8</a>, <a href="12-ter.html#SP8_1">§8.1</a>, <a href="12-ter.html#SP8_2">§8.2</a>, <a href="12-ter.html#SP8_3">§8.3</a>), 12/qr (<a href="12-qr.html#SP7">§7</a>), 12/ca (<a href="12-ca.html#SP6">§6</a>, <a href="12-ca.html#SP6_1">§6.1</a>, <a href="12-ca.html#SP6_2">§6.2</a>, <a href="12-ca.html#SP6_3">§6.3</a>, <a href="12-ca.html#SP6_4">§6.4</a>, <a href="12-ca.html#SP6_5">§6.5</a>), 12/dtd (<a href="12-dtd.html#SP24">§24</a>), 12/cdp (<a href="12-cdp.html#SP5">§5</a>), 15/ep (<a href="15-ep.html#SP15_1">§15.1</a>, <a href="15-ep.html#SP15_2">§15.2</a>), 15/tpr (<a href="15-tpr.html#SP7">§7</a>, <a href="15-tpr.html#SP7_1">§7.1</a>, <a href="15-tpr.html#SP7_2">§7.2</a>), 15/ma (<a href="15-ma.html#SP12">§12</a>), 15/cr (<a href="15-cr.html#SP7_1">§7.1</a>), 15/spr2 (<a href="15-spr2.html#SP11">§11</a>), 16/ic (<a href="16-ic.html#SP15">§15</a>), 23/abrp (<a href="23-abrp.html#SP2">§2</a>), 23/abrc (<a href="23-abrc.html#SP2">§2</a>), 23/abp (<a href="23-abp.html#SP1">§1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_2"></a><b>§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"> = &(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>prototype</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Process the varargs into schema prototype text</span> <span class="cwebmacronumber">4.3</span>><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">>compiled</span><span class="plain"> = </span><span class="functiontext">InterSchemas::from_i6s</span><span class="plain">(&(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>prototype</span><span class="plain">), </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>no_quoted_inames</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>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">§8.6</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_3"></a><b>§4.3. </b>Either way, the schema's prototype is written as follows:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Process the varargs into schema prototype text</span> <span class="cwebmacronumber">4.3</span>> =
|
|
</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><<span class="cwebmacro">Recognise schema-format escape sequences</span> <span class="cwebmacronumber">4.3.1</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">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">§4</a>, <a href="#SP4_1">§4.1</a>, <a href="#SP4_2">§4.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_3_1"></a><b>§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">
|
|
<<span class="cwebmacrodefn">Recognise schema-format escape sequences</span> <span class="cwebmacronumber">4.3.1</span>> =
|
|
</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">>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"> >= 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">>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: <%s> ***\</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">§4.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§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">(&(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>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">§29</a>, <a href="4-am.html#SP39_1">§39.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§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">, &</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">, &</span><span class="identifier">pt1</span><span class="plain">, &</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">, &</span><span class="identifier">pt1</span><span class="plain">, &</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">, &</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">§39.1</a>), 11/tr (<a href="11-tr.html#SP10">§10</a>), 12/ca (<a href="12-ca.html#SP5_2">§5.2</a>), 12/cdp (<a href="12-cdp.html#SP5">§5</a>), 24/sf (<a href="24-sf.html#SP15">§15</a>), 25/cii (<a href="25-cii.html#SP3_5_4">§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">§15.2.2</a>, <a href="6-rlt.html#SP15_2_3">§15.2.3</a>, <a href="6-rlt.html#SP15_2_9_1">§15.2.9.1</a>, <a href="6-rlt.html#SP15_2_10_1">§15.2.10.1</a>, <a href="6-rlt.html#SP15_2_12_1">§15.2.12.1</a>, <a href="6-rlt.html#SP29_5">§29.5</a>, <a href="6-rlt.html#SP29_6">§29.6</a>), 12/dtd (<a href="12-dtd.html#SP23">§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">§15.2.4</a>, <a href="6-rlt.html#SP29_2">§29.2</a>, <a href="6-rlt.html#SP29_3">§29.3</a>, <a href="6-rlt.html#SP29_4">§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>§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">>ops_textual</span><span class="plain">[0]) || (</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">>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">>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">>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">>compiled</span><span class="plain">-</span><span class="element">>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">(&</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>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">&</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">>inline_modifiers</span><span class="plain"> & </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">>inline_modifiers</span><span class="plain"> & </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">>inline_modifiers</span><span class="plain"> & </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">>inline_modifiers</span><span class="plain"> & </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">>inline_modifiers</span><span class="plain"> & </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">>inline_modifiers</span><span class="plain"> & </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">>inline_modifiers</span><span class="plain"> & </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">>inline_modifiers</span><span class="plain"> & </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">>inline_modifiers</span><span class="plain"> & </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">>inline_command</span><span class="plain"> == </span><span class="constant">substitute_ISINC</span><span class="plain">) </span><<span class="cwebmacro">Perform substitution</span> <span class="cwebmacronumber">7.1</span>>
|
|
<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">>inline_command</span><span class="plain"> == </span><span class="constant">current_sentence_ISINC</span><span class="plain">) </span><<span class="cwebmacro">Perform current sentence</span> <span class="cwebmacronumber">7.2</span>>
|
|
<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">>inline_command</span><span class="plain"> == </span><span class="constant">combine_ISINC</span><span class="plain">) </span><<span class="cwebmacro">Perform combine</span> <span class="cwebmacronumber">7.3</span>>
|
|
<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">§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>§7.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Perform substitution</span> <span class="cwebmacronumber">7.1</span>> =
|
|
</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">>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">>ops_termwise</span><span class="plain">[1]-</span><span class="element">>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">>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">) &&</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">>ops_termwise</span><span class="plain">[0]-</span><span class="element">>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">>ops_termwise</span><span class="plain">[0]-</span><span class="element">>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">>ops_termwise</span><span class="plain">[0]-</span><span class="element">>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">>ops_termwise</span><span class="plain">[0]-</span><span class="element">>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">>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">§7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7_2"></a><b>§7.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Perform current sentence</span> <span class="cwebmacronumber">7.2</span>> =
|
|
</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">§7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7_3"></a><b>§7.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Perform combine</span> <span class="cwebmacronumber">7.3</span>> =
|
|
</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">>ops_termwise</span><span class="plain">[0]) && (</span><span class="identifier">ems</span><span class="plain">-</span><span class="element">>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">>ops_termwise</span><span class="plain">[0]-</span><span class="element">>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">>ops_termwise</span><span class="plain">[1]-</span><span class="element">>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">) &&</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">, &</span><span class="identifier">req_A</span><span class="plain">, &</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">, &</span><span class="identifier">found_A</span><span class="plain">, &</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">>ops_termwise</span><span class="plain">[1]-</span><span class="element">>constant</span><span class="plain">, &</span><span class="identifier">spec_A</span><span class="plain">, &</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">)) && (</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">)) && (</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">>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">§7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§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">>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">>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">>term_checked_as_kind</span><span class="plain">, </span><span class="identifier">cast_to</span><span class="plain">, &</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">) &&</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">§7.1</a>, <a href="#SP7_3">§7.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§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">) && (</span><span class="identifier">pt</span><span class="plain">-</span><span class="element">>constant</span><span class="plain">) && (</span><span class="identifier">pt</span><span class="plain">-</span><span class="element">>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">>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">>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">§7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§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">"<null schema>"</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">"<schema: %S>"</span><span class="plain">, &(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>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">"<null schema>"</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">"<%S : $0>"</span><span class="plain">, &(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>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">§5</a>, <a href="1-cm.html#SP6_6">§6.6</a>).</p>
|
|
|
|
<p class="endnote">The function Calculus::Schemas::log_applied is used in 11/tr (<a href="11-tr.html#SP11">§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>
|
|
|