mirror of
https://github.com/ganelson/inform.git
synced 2024-07-16 22:14:23 +03:00
2334 lines
386 KiB
HTML
2334 lines
386 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Compile Invocations Inline</title>
|
|
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
|
|
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Preform-Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
|
|
</head>
|
|
<body class="commentary-font">
|
|
<nav role="navigation">
|
|
<h1><a href="../index.html">
|
|
<img src="../docs-assets/Inform.png" height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul><h2>Compiler Webs</h2><ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul><h2>Inbuild Modules</h2><ul>
|
|
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
|
</ul><h2>Inform7 Modules</h2><ul>
|
|
<li><a href="../core-module/index.html">core</a></li>
|
|
<li><a href="../assertions-module/index.html">assertions</a></li>
|
|
<li><a href="../values-module/index.html">values</a></li>
|
|
<li><a href="../knowledge-module/index.html">knowledge</a></li>
|
|
<li><a href="index.html"><span class="selectedlink">imperative</span></a></li>
|
|
<li><a href="../runtime-module/index.html">runtime</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul><h2>Inter Modules</h2><ul>
|
|
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul><h2>Services</h2><ul>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../calculus-module/index.html">calculus</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
<li><a href="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
<!--Weave of 'Compile Invocations Inline' generated by Inweb-->
|
|
<div class="breadcrumbs">
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</a></li><li><a href="index.html">imperative</a></li><li><a href="index.html#5">Chapter 5: Compilation</a></li><li><b>Compile Invocations Inline</b></li></ul></div>
|
|
<p class="purpose">Here we generate Inform 6 code to execute the phrase(s) called for by an invocation list.</p>
|
|
|
|
<ul class="toc"><li><a href="5-cii.html#SP1">§1. CSI: Inline</a></li><li><a href="5-cii.html#SP3_2">§3.2. Commands about kinds</a></li><li><a href="5-cii.html#SP3_3">§3.3. Typographic commands</a></li><li><a href="5-cii.html#SP3_4">§3.4. Label or counter commands</a></li><li><a href="5-cii.html#SP3_1_1_4">§3.1.1.4. Token annotations</a></li><li><a href="5-cii.html#SP3_5">§3.5. High-level commands</a></li><li><a href="5-cii.html#SP3_6">§3.6. Miscellaneous commands</a></li><li><a href="5-cii.html#SP3_7">§3.7. Primitive definitions</a></li><li><a href="5-cii.html#SP6">§6. Parsing the invocation operands</a></li><li><a href="5-cii.html#SP8">§8. I7 expression evaluation</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. CSI: Inline. </b>The new criminal forensics show. Jack "The Invoker" Flathead, lonely but
|
|
brilliant scene of crime officer, tells it like it is, and as serial killers
|
|
stalk the troubled streets of Inline, Missouri, ... Oh, very well: this is
|
|
the code which turns an inline phrase definition into I6 code. For example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To adjust (N - a number): (- AdjustThis({N}, 1); -).</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">That sounds like an elementary matter of copying it out, but we need to
|
|
expand material in curly braces, according to what amounts to a
|
|
mini-language. So:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>adjust 16;</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">would expand to
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> AdjustThis(16, 1);</span>
|
|
</pre>
|
|
<p class="commentary">The exact definition of this mini-language has been the subject of some
|
|
speculation ever since the early days of the I7 Public Beta: but the exotic
|
|
features it contains were never meant to be used anywhere except by the
|
|
Standard Rules. They may change without warning.
|
|
</p>
|
|
|
|
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_INLINE_DEFN_LENGTH</span><span class="plain-syntax"> </span><span class="constant-syntax">1024</span>
|
|
</pre>
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">csi_state</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">source_location</span><span class="plain-syntax"> *</span><span class="identifier-syntax">where_from</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">tokens_packet</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> **</span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">} </span><span class="reserved-syntax">csi_state</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::Inline::csi_inline_outer</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Invocations::Inline::csi_inline_outer</span></span>:<br/>Compile Invocations - <a href="5-ci.html#SP3_1">§3.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">source_location</span><span class="plain-syntax"> *</span><span class="identifier-syntax">where_from</span><span class="plain-syntax">, </span><span class="reserved-syntax">tokens_packet</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">) {</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">[10]; </span><span class="comment-syntax"> the "my" variables 0 to 9</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP1_1" class="named-paragraph-link"><span class="named-paragraph">Start with all of the implicit my-variables unused</span><span class="named-paragraph-number">1.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP1_2" class="named-paragraph-link"><span class="named-paragraph">Create any new local variables explicitly called for</span><span class="named-paragraph-number">1.2</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">csi_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">.</span><span class="element-syntax">where_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">where_from</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">.</span><span class="element-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ph</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">.</span><span class="element-syntax">inv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">inv</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">.</span><span class="element-syntax">tokens</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">.</span><span class="element-syntax">my_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tail_schema</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP1_3" class="named-paragraph-link"><span class="named-paragraph">Expand those into streams</span><span class="named-paragraph-number">1.3</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-ptd.html#SP26" class="function-link"><span class="function-syntax">Phrases::TypeData::block_follows</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP1_4" class="named-paragraph-link"><span class="named-paragraph">Open a code block</span><span class="named-paragraph-number">1.4</span></a></span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP1_5" class="named-paragraph-link"><span class="named-paragraph">Release any variables created inline</span><span class="named-paragraph-number">1.5</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-></span><span class="element-syntax">inline_mor</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>The structure csi_state is private to this section.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP1_1" class="paragraph-anchor"></a><b>§1.1. </b>Inline invocations, unlike invocations by function call, are allowed to
|
|
create new local variables. There are two ways they can do this: implicitly,
|
|
that is, from <span class="extract"><span class="extract-syntax">{-my:...}</span></span> bracings in the definition, in which case the
|
|
user never knows about these hidden locals:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Start with all of the implicit my-variables unused</span><span class="named-paragraph-number">1.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><10; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP1">§1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP1_2" class="paragraph-anchor"></a><b>§1.2. </b>...And explicitly, where the phrase typed by the user actually names the
|
|
variable(s) to be created, as here:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>repeat with the item count running from 1 to 4:</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">where "item count" needs to be created as a number variable. (The type
|
|
checker has already done all of the work to decide what kind it has.)
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Create any new local variables explicitly called for</span><span class="named-paragraph-number">1.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><a href="5-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_no_tokens</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">); </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_token_variable_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP1_2_1" class="named-paragraph-link"><span class="named-paragraph">Create a local at this token</span><span class="named-paragraph-number">1.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP1">§1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP1_2_1" class="paragraph-anchor"></a><b>§1.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Create a local at this token</span><span class="named-paragraph-number">1.2.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><a href="4-lv.html#SP9" class="function-link"><span class="function-syntax">LocalVariables::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">), </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-ptd.html#SP26" class="function-link"><span class="function-syntax">Phrases::TypeData::block_follows</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) == </span><span class="constant-syntax">LOOP_BODY_BLOCK_FOLLOWS</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="4-pb.html#SP18" class="function-link"><span class="function-syntax">Frames::Blocks::set_scope_to_block_about_to_open</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
|
<span class="plain-syntax"> </span><a href="4-pb.html#SP17" class="function-link"><span class="function-syntax">Frames::Blocks::set_variable_scope</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] =</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Lvalues::new_LOCAL_VARIABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">), </span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar_s</span><span class="plain-syntax"> = </span><a href="4-lv.html#SP46" class="function-link"><span class="function-syntax">LocalVariables::declare_this</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">8</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">lvar_s</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="4-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::emit_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP1_2">§1.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP1_3" class="paragraph-anchor"></a><b>§1.3. </b>Most phrases don't have tail definitions, so we only open such a stream
|
|
if we have to. All phrases have heads, but no opening is needed, since the
|
|
head goes to <span class="extract"><span class="extract-syntax">OUT</span></span>.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand those into streams</span><span class="named-paragraph-number">1.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><a href="5-cii.html#SP2" class="function-link"><span class="function-syntax">Invocations::Inline::csi_inline_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::get_inter_head</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">), &</span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::get_inter_tail</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">)) </span><span class="identifier-syntax">tail_schema</span><span class="plain-syntax"> = </span><a href="3-phr.html#SP10" class="function-link"><span class="function-syntax">Phrases::get_inter_tail</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP1">§1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP1_4" class="paragraph-anchor"></a><b>§1.4. </b>Suppose there's a phrase with both head and tail. Then the tail won't appear
|
|
until much later on, when the new code block finishes. We won't live to see it;
|
|
in this routine, all we do is write the head. So we pass the tailpiece to
|
|
the code block handler, to be spliced in later on. (This is why we never close
|
|
the <span class="extract"><span class="extract-syntax">TAIL</span></span> stream: that happens when the block closes.)
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Open a code block</span><span class="named-paragraph-number">1.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-inv.html#SP16" class="function-link"><span class="function-syntax">Invocations::get_no_tokens</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">val</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0];</span>
|
|
<span class="plain-syntax"> </span><a href="4-pb.html#SP10" class="function-link"><span class="function-syntax">Frames::Blocks::supply_val_and_stream</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">, </span><span class="identifier-syntax">tail_schema</span><span class="plain-syntax">, </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP1">§1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP1_5" class="paragraph-anchor"></a><b>§1.5. </b>As we will see (in the discussion of <span class="extract"><span class="extract-syntax">{-my:...}</span></span> below), any variables made
|
|
as scratch values for the invocation are deallocated as soon as we're finished,
|
|
unless a code block is opened: if it is, then they're deallocated when it ends.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Release any variables created inline</span><span class="named-paragraph-number">1.5</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><10; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">])</span>
|
|
<span class="plain-syntax"> </span><a href="4-lv.html#SP14" class="function-link"><span class="function-syntax">LocalVariables::deallocate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP1">§1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>We can now forget about heads and tails, and work on expanding a single
|
|
inline definition into a single stream. Often this just involves copying it,
|
|
but there are two ways to escape from that transcription: with a "bracing",
|
|
or with a fragment of Inform 7 source text inside <span class="extract"><span class="extract-syntax">(+</span></span> and <span class="extract"><span class="extract-syntax">+)</span></span>.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::Inline::csi_inline_inner</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Invocations::Inline::csi_inline_inner</span></span>:<br/><a href="5-cii.html#SP1_3">§1.3</a><br/>Phrase Blocks - <a href="4-pb.html#SP13">§13</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="reserved-syntax">csi_state</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VH</span><span class="plain-syntax">-></span><span class="identifier-syntax">vhmode_wanted</span><span class="plain-syntax"> == </span><span class="identifier-syntax">INTER_VAL_VHMODE</span><span class="plain-syntax">) </span><span class="identifier-syntax">VH</span><span class="plain-syntax">-></span><span class="identifier-syntax">vhmode_provided</span><span class="plain-syntax"> = </span><span class="identifier-syntax">INTER_VAL_VHMODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">VH</span><span class="plain-syntax">-></span><span class="identifier-syntax">vhmode_provided</span><span class="plain-syntax"> = </span><span class="identifier-syntax">INTER_VOID_VHMODE</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">to_code</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">to_val</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VH</span><span class="plain-syntax">-></span><span class="identifier-syntax">vhmode_wanted</span><span class="plain-syntax"> == </span><span class="identifier-syntax">INTER_VAL_VHMODE</span><span class="plain-syntax">) { </span><span class="identifier-syntax">to_val</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="identifier-syntax">to_code</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitInterSchemas::emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_code</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_val</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> &</span><a href="5-cii.html#SP3" class="function-link"><span class="function-syntax">Invocations::Inline::csi_inline_inner_inner</span></a><span class="plain-syntax">, &</span><a href="5-cii.html#SP8" class="function-link"><span class="function-syntax">Invocations::Inline::compile_I7_expression_from_text</span></a><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b></p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::Inline::csi_inline_inner_inner</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Invocations::Inline::csi_inline_inner_inner</span></span>:<br/><a href="5-cii.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_schema_token</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sche</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CSIS_s</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">prim_cat</span><span class="plain-syntax">) {</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">csi_state</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CSIS</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">csi_state</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">CSIS_s</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">-></span><span class="element-syntax">ph</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">-></span><span class="element-syntax">inv</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">tokens_packet</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tokens</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">-></span><span class="element-syntax">tokens</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> **</span><span class="identifier-syntax">my_vars</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CSIS</span><span class="plain-syntax">-></span><span class="element-syntax">my_vars</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> != </span><span class="identifier-syntax">no_ISINC</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">primitive_definition_ISINC</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_7" class="named-paragraph-link"><span class="named-paragraph">Expand an entirely internal-made definition</span><span class="named-paragraph-number">3.7</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2" class="named-paragraph-link"><span class="named-paragraph">Expand a bracing containing a kind command</span><span class="named-paragraph-number">3.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_3" class="named-paragraph-link"><span class="named-paragraph">Expand a bracing containing a typographic command</span><span class="named-paragraph-number">3.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_4" class="named-paragraph-link"><span class="named-paragraph">Expand a bracing containing a label or counter command</span><span class="named-paragraph-number">3.4</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5" class="named-paragraph-link"><span class="named-paragraph">Expand a bracing containing a high-level command</span><span class="named-paragraph-number">3.5</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_6" class="named-paragraph-link"><span class="named-paragraph">Expand a bracing containing a miscellaneous command</span><span class="named-paragraph-number">3.6</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">BRW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">bracing</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Expand a bracing containing natural language text</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. </b>We'll take the easier, outward-facing syntax first: the bracings which
|
|
are part of the public Inform language. There are four ways this can go:
|
|
</p>
|
|
|
|
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">OPTS_INSUB</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> the text "phrase options"</span>
|
|
<span class="definition-keyword">define</span> <span class="constant-syntax">OPT_INSUB</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax"> </span><span class="comment-syntax"> the name of a specific phrase option</span>
|
|
<span class="definition-keyword">define</span> <span class="constant-syntax">LOCAL_INSUB</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax"> </span><span class="comment-syntax"> the name of a token</span>
|
|
<span class="definition-keyword">define</span> <span class="constant-syntax">PROBLEM_INSUB</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax"> </span><span class="comment-syntax"> the syntax was wrong, so do nothing</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>Suppose we are invoking the following inline phrase definition:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To print (something - text) : (- print (PrintI6Text) {something}; -).</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">Here the inline definition is <span class="extract"><span class="extract-syntax">"print (PrintI6Text) {something};"</span></span> and the
|
|
bracing, <span class="extract"><span class="extract-syntax">{something}</span></span>, stands for something to be substituted in. This is
|
|
usually the name of one of the tokens in the phrase preamble, as it is here.
|
|
The name of any individual phrase option (valid in the phrase now being
|
|
invoked) expands to true or false according to whether it has been used;
|
|
the fixed text "phrase options" expands to the whole bitmap.
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><inline-substitution></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">phrase</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">options</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> { OPTS_INSUB, - }</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><phrase-option></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> { OPT_INSUB, -, <<opt>> = R[1] }</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><name-local-to-inline-stack-frame></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> { LOCAL_INSUB, -, <<local_variable:var>> = RP[1] }</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">Issue PM_BadInlineExpansion problem</span><span class="named-paragraph-number">5.2</span></a></span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP5_1" class="paragraph-anchor"></a><b>§5.1. </b>This matches one of the token names in the preamble to the inline definition.
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><name-local-to-inline-stack-frame></span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">local_variable</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">lvar</span><span class="Preform-plain-syntax"> = </span><a href="4-lv.html#SP23" class="function-link"><span class="Preform-function-syntax">LocalVariables::parse</span></a><span class="Preform-plain-syntax">(&(</span><span class="Preform-identifier-syntax">ph_being_parsed</span><span class="Preform-plain-syntax">-></span><span class="Preform-element-syntax">stack_frame</span><span class="Preform-plain-syntax">), </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">lvar</span><span class="Preform-plain-syntax">) {</span>
|
|
<span class="Preform-plain-syntax"> ==> { -, </span><span class="Preform-identifier-syntax">lvar</span><span class="Preform-plain-syntax"> };</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">TRUE</span><span class="Preform-plain-syntax">;</span>
|
|
<span class="Preform-plain-syntax"> }</span>
|
|
<span class="Preform-plain-syntax"> ==> { </span><span class="Preform-identifier-syntax">fail</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">nonterminal</span><span class="Preform-plain-syntax"> };</span>
|
|
<span class="Preform-plain-syntax">}</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP5_2" class="paragraph-anchor"></a><b>§5.2. </b>In my first draft of Inform, this paragraph made reference to "meddling
|
|
charlatans" and what they "deserve". I'm a better person now.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_BadInlineExpansion problem</span><span class="named-paragraph-number">5.2</span></span><span class="Preform-comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_BadInlineExpansion</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but when I looked that phrase up I found that its inline "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"definition included the bracing {%2}. Text written in braces like this, "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"in an inline phrase definition, should be one of the following: a name "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"of one of the tokens in the phrase, or a phrase option, or the text "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"'phrase options' itself. %PThe ability to write inline phrases is really "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"intended only for the Standard Rules and a few other low-level system "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"extensions. A good rule of thumb is: if you can define a phrase without "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"using I6 insertions, do."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> ==> { </span><span class="constant-syntax">PROBLEM_INSUB</span><span class="plain-syntax">, - };</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP5">§5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1" class="paragraph-anchor"></a><b>§3.1. </b>Acting on that:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand a bracing containing natural language text</span><span class="named-paragraph-number">3.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = &(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-></span><span class="element-syntax">options_data</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">ph_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ph</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="function-syntax"><inline-substitution></span><span class="plain-syntax">(</span><span class="identifier-syntax">BRW</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">current_opts</span><span class="plain-syntax"> = </span><a href="5-inv.html#SP20" class="function-link"><span class="function-syntax">Invocations::get_phrase_options_bitmap</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="function-syntax"><<r>></span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OPTS_INSUB:</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">current_opts</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OPT_INSUB:</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">current_opts</span><span class="plain-syntax"> & </span><span class="function-syntax"><<opt>></span><span class="plain-syntax">) </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">); </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOCAL_INSUB:</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="function-syntax"><<local_variable:var>></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tok</span><span class="plain-syntax"> = </span><a href="4-lv.html#SP8" class="function-link"><span class="function-syntax">LocalVariables::get_parameter_number</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tok</span><span class="plain-syntax"> >= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1" class="named-paragraph-link"><span class="named-paragraph">Expand a bracing containing a token name</span><span class="named-paragraph-number">3.1.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3">§3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1" class="paragraph-anchor"></a><b>§3.1.1. </b>At this point, the bracing text is the name of token number <span class="extract"><span class="extract-syntax">tok</span></span>. Usually
|
|
we compile the value of that argument as drawn from the tokens packet, but
|
|
the presence of annotations can change what we do.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand a bracing containing a token name</span><span class="named-paragraph-number">3.1.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">supplied</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[</span><span class="identifier-syntax">tok</span><span class="plain-syntax">];</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">by_value_not_reference</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">blank_out</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">reference_exists</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">require_to_be_lvalue</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">BEGIN_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4" class="named-paragraph-link"><span class="named-paragraph">Take account of any annotation to the inline token</span><span class="named-paragraph-number">3.1.1.4</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[27];</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Work out values for the kind variables in this context</span><span class="named-paragraph-number">3.1.1.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="4-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">changed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_required</span><span class="plain-syntax"> =</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::substitute</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-></span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">token_sequence</span><span class="plain-syntax">[</span><span class="identifier-syntax">tok</span><span class="plain-syntax">].</span><span class="element-syntax">token_kind</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">, &</span><span class="identifier-syntax">changed</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_2" class="named-paragraph-link"><span class="named-paragraph">If the token has to be an lvalue, reject it if it isn't</span><span class="named-paragraph-number">3.1.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_3" class="named-paragraph-link"><span class="named-paragraph">Compile the token value</span><span class="named-paragraph-number">3.1.1.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="4-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">END_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1">§3.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_1" class="paragraph-anchor"></a><b>§3.1.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Work out values for the kind variables in this context</span><span class="named-paragraph-number">3.1.1.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[0] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=1; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><=26; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><a href="4-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::get_kind_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_variable_declaration</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kvd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (; </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">; </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">=</span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">) </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[</span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-></span><span class="identifier-syntax">kv_number</span><span class="plain-syntax">] = </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-></span><span class="identifier-syntax">kv_value</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1">§3.1.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_2" class="paragraph-anchor"></a><b>§3.1.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">If the token has to be an lvalue, reject it if it isn't</span><span class="named-paragraph-number">3.1.1.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">require_to_be_lvalue</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lvalues::get_nonlocal_variable_if_any</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (((</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">NonlocalVariables::is_constant</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">))) ||</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">Lvalues::is_lvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">-></span><span class="element-syntax">name</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_spec</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_NotAnLvalue</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but that seems to mean changing '%2', which "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"is a constant and can't be altered."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1">§3.1.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_3" class="paragraph-anchor"></a><b>§3.1.1.3. </b>The noteworthy thing here is the switch of compilation mode on text tokens.
|
|
It allows this:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>let X be 17; write "remember [X]" to the file of Memos;</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">to work, the tricky part being that the definition being invoked is:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> FileIO_PutContents({FN}, {T}, false);</span>
|
|
</pre>
|
|
<p class="commentary">The <span class="extract"><span class="extract-syntax">{T}</span></span> bracing is the text one which triggers the mode change. The effect
|
|
is to ensure that the token is compiled along with recordings being made of
|
|
the current values of any local variables mentioned in it (bearing in mind
|
|
that text includes text substitutions). This seems so obviously a good thing
|
|
that it's hard to see why it isn't on by default. Well, it would be, except
|
|
that then response text changes using "now" would go wrong:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>now can't exit closed containers rule response (A) is "Pesky [cage].";</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">The reference to "cage" in that text is to a local variable on the stack
|
|
frame for the can't exit closed containers rule, not to the local stack frame.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile the token value</span><span class="named-paragraph-number">3.1.1.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_required</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_text</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_ENTER</span><span class="plain-syntax">(</span><span class="constant-syntax">PERMIT_LOCALS_IN_TEXT_CMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">by_value_not_reference</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_ENTER</span><span class="plain-syntax">(</span><span class="constant-syntax">DEREFERENCE_POINTERS_CMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">by_value_not_reference</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_EXIT</span><span class="plain-syntax">(</span><span class="constant-syntax">DEREFERENCE_POINTERS_CMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">blank_out</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_ENTER</span><span class="plain-syntax">(</span><span class="constant-syntax">BLANK_OUT_CMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">blank_out</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_EXIT</span><span class="plain-syntax">(</span><span class="constant-syntax">BLANK_OUT_CMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">reference_exists</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_ENTER</span><span class="plain-syntax">(</span><span class="identifier-syntax">TABLE_EXISTENCE_CMODE_ISSBM</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">reference_exists</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_EXIT</span><span class="plain-syntax">(</span><span class="identifier-syntax">TABLE_EXISTENCE_CMODE_ISSBM</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">MATCHING</span><span class="plain-syntax">, </span><span class="string-syntax">"Expanding $P into '%W' with %d, %u%s%s\n"</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">supplied</span><span class="plain-syntax">, </span><span class="identifier-syntax">BRW</span><span class="plain-syntax">, </span><span class="identifier-syntax">tok</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_required</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">changed</span><span class="plain-syntax">?</span><span class="string-syntax">" (after kind substitution)"</span><span class="plain-syntax">:</span><span class="string-syntax">""</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">by_value_not_reference</span><span class="plain-syntax">?</span><span class="string-syntax">" (by value)"</span><span class="plain-syntax">:</span><span class="string-syntax">" (by reference)"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="2-cfs.html#SP7" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_required</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1">§3.1.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_2" class="paragraph-anchor"></a><b>§3.2. Commands about kinds. </b>And that's it for the general machinery, but in another sense we're only just
|
|
getting started. We now go through all of the special syntaxes which make
|
|
invocation-language so baroque.
|
|
</p>
|
|
|
|
<p class="commentary">We'll start with a suite of details about kinds:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> {-command:kind name}</span>
|
|
</pre>
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand a bracing containing a kind command</span><span class="named-paragraph-number">3.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">new_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_1" class="named-paragraph-link"><span class="named-paragraph">Inline command "new"</span><span class="named-paragraph-number">3.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">new_list_of_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_2" class="named-paragraph-link"><span class="named-paragraph">Inline command "new-list-of"</span><span class="named-paragraph-number">3.2.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">printing_routine_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_5" class="named-paragraph-link"><span class="named-paragraph">Inline command "printing-routine"</span><span class="named-paragraph-number">3.2.5</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ranger_routine_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_6" class="named-paragraph-link"><span class="named-paragraph">Inline command "ranger-routine"</span><span class="named-paragraph-number">3.2.6</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">next_routine_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_3" class="named-paragraph-link"><span class="named-paragraph">Inline command "next-routine"</span><span class="named-paragraph-number">3.2.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">previous_routine_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_4" class="named-paragraph-link"><span class="named-paragraph">Inline command "previous-routine"</span><span class="named-paragraph-number">3.2.4</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">strong_kind_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_7" class="named-paragraph-link"><span class="named-paragraph">Inline command "strong-kind"</span><span class="named-paragraph-number">3.2.7</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">weak_kind_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_8" class="named-paragraph-link"><span class="named-paragraph">Inline command "weak-kind"</span><span class="named-paragraph-number">3.2.8</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3">§3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_2_1" class="paragraph-anchor"></a><b>§3.2.1. </b>The following produces a new value of the given kind. If it's stored as a
|
|
word value, this will just be the default value, so <span class="extract"><span class="extract-syntax">{-new:time}</span></span> will output
|
|
540, that being the Inform 6 representation of 9:00 AM. If it's a block value,
|
|
we compile code which creates a new value stored on the heap. This comes into
|
|
its own when kind variables are in play.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "new"</span><span class="named-paragraph-number">3.2.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><a href="4-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::emit_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_1_2" class="named-paragraph-link"><span class="named-paragraph">Issue an inline no-such-kind problem</span><span class="named-paragraph-number">3.2.1.2</span></a></span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::RunTime::emit_default_value_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_1_1" class="named-paragraph-link"><span class="named-paragraph">Issue problem for no natural choice</span><span class="named-paragraph-number">3.2.1.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_2">§3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_2_1_1" class="paragraph-anchor"></a><b>§3.2.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue problem for no natural choice</span><span class="named-paragraph-number">3.2.1.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_kind</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_NoNaturalDefault2</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"To achieve %1, we'd need to be able to store a default value of "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"the kind '%2', but there's no natural choice for this."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_2_1">§3.2.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_2_2" class="paragraph-anchor"></a><b>§3.2.2. </b>The following complication makes lists of a given description. The inline
|
|
definition:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> LIST_OF_TY_Desc({-new:list of K}, {D}, {-strong-kind:K})</span>
|
|
</pre>
|
|
<p class="commentary">is not good enough, because it fails if the description D makes reference to
|
|
local variables (as it well may); instead we must construe D as a deferred
|
|
proposition.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "new-list-of"</span><span class="named-paragraph-number">3.2.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="2-dtd.html#SP16" class="function-link"><span class="function-syntax">Calculus::Deferrals::emit_list_of_S</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_2">§3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_2_3" class="paragraph-anchor"></a><b>§3.2.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "next-routine"</span><span class="named-paragraph-number">3.2.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Kinds::Behaviour::get_inc_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_1_2" class="named-paragraph-link"><span class="named-paragraph">Issue an inline no-such-kind problem</span><span class="named-paragraph-number">3.2.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_2">§3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_2_4" class="paragraph-anchor"></a><b>§3.2.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "previous-routine"</span><span class="named-paragraph-number">3.2.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Kinds::Behaviour::get_dec_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_1_2" class="named-paragraph-link"><span class="named-paragraph">Issue an inline no-such-kind problem</span><span class="named-paragraph-number">3.2.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_2">§3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_2_5" class="paragraph-anchor"></a><b>§3.2.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "printing-routine"</span><span class="named-paragraph-number">3.2.5</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Kinds::Behaviour::get_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_1_2" class="named-paragraph-link"><span class="named-paragraph">Issue an inline no-such-kind problem</span><span class="named-paragraph-number">3.2.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_2">§3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_2_6" class="paragraph-anchor"></a><b>§3.2.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "ranger-routine"</span><span class="named-paragraph-number">3.2.6</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">)) ||</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_time</span><span class="plain-syntax">)))</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">GENERATERANDOMNUMBER_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Kinds::Behaviour::get_ranger_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_1_2" class="named-paragraph-link"><span class="named-paragraph">Issue an inline no-such-kind problem</span><span class="named-paragraph-number">3.2.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_2">§3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_2_7" class="paragraph-anchor"></a><b>§3.2.7. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "strong-kind"</span><span class="named-paragraph-number">3.2.7</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::RunTime::emit_strong_id_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_1_2" class="named-paragraph-link"><span class="named-paragraph">Issue an inline no-such-kind problem</span><span class="named-paragraph-number">3.2.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_2">§3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_2_8" class="paragraph-anchor"></a><b>§3.2.8. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "weak-kind"</span><span class="named-paragraph-number">3.2.8</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) </span><span class="identifier-syntax">Kinds::RunTime::emit_weak_id_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_1_2" class="named-paragraph-link"><span class="named-paragraph">Issue an inline no-such-kind problem</span><span class="named-paragraph-number">3.2.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_2">§3.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_2_1_2" class="paragraph-anchor"></a><b>§3.2.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue an inline no-such-kind problem</span><span class="named-paragraph-number">3.2.1.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineNew</span><span class="plain-syntax">), </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">owner</span><span class="plain-syntax">-></span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-></span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I don't know any kind called '%4'."</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_2_1">§3.2.1</a>, <a href="5-cii.html#SP3_2_3">§3.2.3</a>, <a href="5-cii.html#SP3_2_4">§3.2.4</a>, <a href="5-cii.html#SP3_2_5">§3.2.5</a>, <a href="5-cii.html#SP3_2_6">§3.2.6</a>, <a href="5-cii.html#SP3_2_7">§3.2.7</a>, <a href="5-cii.html#SP3_2_8">§3.2.8</a>, <a href="5-cii.html#SP3_5_8">§3.5.8</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_3" class="paragraph-anchor"></a><b>§3.3. Typographic commands. </b>These rather crude commands work on a character-by-character level in the
|
|
code we're generating.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand a bracing containing a typographic command</span><span class="named-paragraph-number">3.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">backspace_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_3_1" class="named-paragraph-link"><span class="named-paragraph">Inline command "backspace"</span><span class="named-paragraph-number">3.3.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">erase_ISINC</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">open_brace_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_3_2" class="named-paragraph-link"><span class="named-paragraph">Inline command "open-brace"</span><span class="named-paragraph-number">3.3.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">close_brace_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_3_3" class="named-paragraph-link"><span class="named-paragraph">Inline command "close-brace"</span><span class="named-paragraph-number">3.3.3</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3">§3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_3_1" class="paragraph-anchor"></a><b>§3.3.1. </b>The first two commands control the stream of text produced in inline
|
|
definition expansion, allowing us to back up along it. First, a single
|
|
character:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "backspace"</span><span class="named-paragraph-number">3.3.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_BackspaceWithdrawn</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I attempted to compile %1 using its inline definition, "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"but this contained the invalid annotation '{backspace}', "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"which has been withdrawn. (Inline annotations are no longer "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"allowed to amend the compilation stream to their left.)"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_3">§3.3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_3_2" class="paragraph-anchor"></a><b>§3.3.2. </b>These should never occur in well-formed inter schemas; a schema would fail
|
|
lint if they did.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "open-brace"</span><span class="named-paragraph-number">3.3.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_3">§3.3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_3_3" class="paragraph-anchor"></a><b>§3.3.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "close-brace"</span><span class="named-paragraph-number">3.3.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_3">§3.3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_4" class="paragraph-anchor"></a><b>§3.4. Label or counter commands. </b>Here we want to generate unique numbers, or uniquely named labels, on demand.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand a bracing containing a label or counter command</span><span class="named-paragraph-number">3.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">label_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_4_1" class="named-paragraph-link"><span class="named-paragraph">Inline command "label"</span><span class="named-paragraph-number">3.4.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">counter_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_4_2" class="named-paragraph-link"><span class="named-paragraph">Inline command "counter"</span><span class="named-paragraph-number">3.4.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">counter_storage_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_4_3" class="named-paragraph-link"><span class="named-paragraph">Inline command "counter-storage"</span><span class="named-paragraph-number">3.4.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">counter_up_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_4_4" class="named-paragraph-link"><span class="named-paragraph">Inline command "counter-up"</span><span class="named-paragraph-number">3.4.4</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">counter_down_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_4_5" class="named-paragraph-link"><span class="named-paragraph">Inline command "counter-down"</span><span class="named-paragraph-number">3.4.5</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">counter_makes_array_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_4_6" class="named-paragraph-link"><span class="named-paragraph">Inline command "counter-makes-array"</span><span class="named-paragraph-number">3.4.6</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3">§3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_4_1" class="paragraph-anchor"></a><b>§3.4.1. </b>We can have any number of sets of labels, each with its own base name,
|
|
which should be supplied as the argument. For example:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> {-label:pineapple}</span>
|
|
</pre>
|
|
<p class="commentary">generates the current label in the "pineapple" set. (Sets don't need to be
|
|
declared: they can be mentioned the first time they are used.) These label
|
|
names take the form <span class="extract"><span class="extract-syntax">L_pineapple_0</span></span>, <span class="extract"><span class="extract-syntax">L_pineapple_1</span></span>, and so on; each named
|
|
set has its own counter (0, 1, 2, ...). So this inline definition works
|
|
safely:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> jump {-label:leap}; print "Yikes! A trap!"; .{-label:leap}{-counter-up:leap};</span>
|
|
</pre>
|
|
<p class="commentary">if a little pointlessly, generating first
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> jump L_leap_0; print "Yikes! A trap!"; .L_leap_0;</span>
|
|
</pre>
|
|
<p class="commentary">and then
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> jump L_leap_1; print "Yikes! A trap!"; .L_leap_1;</span>
|
|
</pre>
|
|
<p class="commentary">and so on. The point of this is that it guarantees we won't define two labels
|
|
with identical names in the same Inform 6 routine, which would fail to compile.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "label"</span><span class="named-paragraph-number">3.4.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="string-syntax">"."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">JumpLabels::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::lab</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Produce::reserve_label</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">L</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_4">§3.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_4_2" class="paragraph-anchor"></a><b>§3.4.2. </b>We can also output just the numerical counter:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "counter"</span><span class="named-paragraph-number">3.4.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">JumpLabels::read_counter</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_4">§3.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_4_3" class="paragraph-anchor"></a><b>§3.4.3. </b>We can also output just the storage array:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "counter-storage"</span><span class="named-paragraph-number">3.4.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">JumpLabels::storage</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_4">§3.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_4_4" class="paragraph-anchor"></a><b>§3.4.4. </b>Or increment it, printing nothing:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "counter-up"</span><span class="named-paragraph-number">3.4.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">JumpLabels::read_counter</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_4">§3.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_4_5" class="paragraph-anchor"></a><b>§3.4.5. </b>Or decrement it. (Careful, though: if it decrements below zero, an enigmatic
|
|
internal error will halt Inform.)
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "counter-down"</span><span class="named-paragraph-number">3.4.5</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">JumpLabels::read_counter</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_4">§3.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_4_6" class="paragraph-anchor"></a><b>§3.4.6. </b>We can use counters for anything, not just to generate labels, and one
|
|
useful trick is to allocate storage at run-time. Invoking
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> {-counter-makes-array:pineapple}</span>
|
|
</pre>
|
|
<p class="commentary">at any time during compilation (once or many times over, it makes no
|
|
difference) causes Inform to generate an array called <span class="extract"><span class="extract-syntax">I7_ST_pineapple</span></span>
|
|
guaranteed to contain one entry for each counter value reached. Thus:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To remember (N - a number) for later: ...</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">might be defined inline as
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> {-counter-makes-array:pineapple}I7_ST_pineapple-->{-counter:pineapple} = {N};</span>
|
|
</pre>
|
|
<p class="commentary">and the effect will be to accumulate an array of numbers during compilation.
|
|
Note that the value of a counter can also be read in template language,
|
|
so with a little care we can get the final extent of the array, too. If more
|
|
than one word of storage per count is needed, try:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> {-counter-makes-array:pineapple:3}</span>
|
|
</pre>
|
|
<p class="commentary">or similar — this ensures that the array contains not fewer than three times
|
|
as many cells as the final value of the count. (If multiple invocations are
|
|
made with different numbers here, the maximum is taken.)
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "counter-makes-array"</span><span class="named-paragraph-number">3.4.6</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">words_per_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">words_per_count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::atoi</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">JumpLabels::allocate_counter</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">words_per_count</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_4">§3.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4" class="paragraph-anchor"></a><b>§3.1.1.4. Token annotations. </b>The next category of invocation commands takes the form of an "annotation"
|
|
slightly changing the way a token would normally be compiled, but basically
|
|
using the same machinery as if the annotation hadn't been there.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Take account of any annotation to the inline token</span><span class="named-paragraph-number">3.1.1.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">valid_annotation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">by_reference_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_1" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "by-reference"</span><span class="named-paragraph-number">3.1.1.4.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">by_reference_blank_out_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_2" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "by-reference-blank-out"</span><span class="named-paragraph-number">3.1.1.4.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">reference_exists_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_3" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "reference-exists"</span><span class="named-paragraph-number">3.1.1.4.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">lvalue_by_reference_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_4" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "lvalue-by-reference"</span><span class="named-paragraph-number">3.1.1.4.4</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">by_value_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_5" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "by-value"</span><span class="named-paragraph-number">3.1.1.4.5</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">box_quotation_text_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_6" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "box-quotation-text"</span><span class="named-paragraph-number">3.1.1.4.6</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">try_action_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_9" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "try-action"</span><span class="named-paragraph-number">3.1.1.4.9</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">try_action_silently_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_10" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "try-action-silently"</span><span class="named-paragraph-number">3.1.1.4.10</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">return_value_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_7" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "return-value"</span><span class="named-paragraph-number">3.1.1.4.7</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">return_value_from_rule_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_8" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "return-value-from-rule"</span><span class="named-paragraph-number">3.1.1.4.8</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">property_holds_block_value_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_11" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "property-holds-block-value"</span><span class="named-paragraph-number">3.1.1.4.11</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">mark_event_used_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_12" class="named-paragraph-link"><span class="named-paragraph">Inline annotation "mark-event-used"</span><span class="named-paragraph-number">3.1.1.4.12</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> != </span><span class="identifier-syntax">no_ISINC</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">valid_annotation</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_13" class="named-paragraph-link"><span class="named-paragraph">Throw a problem message for an invalid inline annotation</span><span class="named-paragraph-number">3.1.1.4.13</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1">§3.1.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_1" class="paragraph-anchor"></a><b>§3.1.1.4.1. </b>This affects only block values. When it's used, the token accepts the pointer
|
|
to the block value directly, that is, not copying the data over to a fresh
|
|
copy and using that instead. This means a definition like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To zap (L - a list of numbers): (- Zap({-by-reference:L}, 10); -).</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">will call <span class="extract"><span class="extract-syntax">Zap</span></span> on the actual list supplied to it. If <span class="extract"><span class="extract-syntax">Zap</span></span> chooses to change
|
|
this list, the original will change.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "by-reference"</span><span class="named-paragraph-number">3.1.1.4.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">by_value_not_reference</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">valid_annotation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_2" class="paragraph-anchor"></a><b>§3.1.1.4.2. </b>And, variedly:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "by-reference-blank-out"</span><span class="named-paragraph-number">3.1.1.4.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">by_value_not_reference</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">valid_annotation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">blank_out</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_3" class="paragraph-anchor"></a><b>§3.1.1.4.3. </b>And, variedly:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "reference-exists"</span><span class="named-paragraph-number">3.1.1.4.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">by_value_not_reference</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">valid_annotation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">reference_exists</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_4" class="paragraph-anchor"></a><b>§3.1.1.4.4. </b>This is a variant which checks that the reference is to an lvalue, that
|
|
is, to something which can be changed. If this weren't done, then
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>remove 2 from {1, 2, 3}</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">would compile without problem messages, though it would behave pretty oddly
|
|
at run-time.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "lvalue-by-reference"</span><span class="named-paragraph-number">3.1.1.4.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">by_value_not_reference</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">valid_annotation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">require_to_be_lvalue</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_5" class="paragraph-anchor"></a><b>§3.1.1.4.5. </b>This is the default, so it's redundant, but clarifies definitions.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "by-value"</span><span class="named-paragraph-number">3.1.1.4.5</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">by_value_not_reference</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">valid_annotation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_6" class="paragraph-anchor"></a><b>§3.1.1.4.6. </b>This is used only for the box statement in I6, which has slightly different
|
|
textual requirements than regular I6 text. We could get rid of this by making
|
|
a kind for box-quotation-text, and casting regular text to it, but honestly
|
|
having this annotation seems the smaller of the two warts.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "box-quotation-text"</span><span class="named-paragraph-number">3.1.1.4.6</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_CONSTANT_of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_text</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_spec</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_Misboxed</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I attempted to compile %1, but the text '%2' supplied to be a "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"boxed quotation wasn't a constant piece of text in double-quotes. "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I'm afraid that's the only sort of text allowed here."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_ENTER</span><span class="plain-syntax">(</span><span class="constant-syntax">COMPILE_TEXT_TO_QUOT_CMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">by_value_not_reference</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">valid_annotation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_7" class="paragraph-anchor"></a><b>§3.1.1.4.7. </b>Suppose we are invoking:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>decide on 102;</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">from the Standard Rules definition:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> return {-return-value:something};</span>
|
|
</pre>
|
|
<p class="commentary">We clearly need to police this: if the phrase is deciding a number, we need
|
|
to object to:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>decide on "fish fingers";</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">That's one purpose of this annotation: it checks the value to see if it's
|
|
suitable to be returned. But we also might have to cast the value, or
|
|
check that it's valid at run-time. For instance, in a phrase to decide a
|
|
container, given
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>decide on the item;</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">we may need to check "item" at run-time: at compile-time we know it's an
|
|
object, but not necessarily that it's a container.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "return-value"</span><span class="named-paragraph-number">3.1.1.4.7</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">returning_from_rule</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_7_1" class="named-paragraph-link"><span class="named-paragraph">Handle an inline return</span><span class="named-paragraph-number">3.1.1.4.7.1</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_8" class="paragraph-anchor"></a><b>§3.1.1.4.8. </b>Exactly the same mechanism is needed for rules which produce a value, but
|
|
the problem messages are phrased differently if something goes wrong.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "return-value-from-rule"</span><span class="named-paragraph-number">3.1.1.4.8</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">returning_from_rule</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_7_1" class="named-paragraph-link"><span class="named-paragraph">Handle an inline return</span><span class="named-paragraph-number">3.1.1.4.7.1</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_7_1" class="paragraph-anchor"></a><b>§3.1.1.4.7.1. </b>So here's the common code:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Handle an inline return</span><span class="named-paragraph-number">3.1.1.4.7.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">returning_from_rule</span><span class="plain-syntax">) </span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rulebooks::kind_from_context</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax"> = </span><a href="4-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::get_kind_returned</span></a><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_supplied</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">mor</span><span class="plain-syntax"> = </span><a href="3-ptd.html#SP10" class="function-link"><span class="function-syntax">Phrases::TypeData::get_mor</span></a><span class="plain-syntax">(&(</span><span class="identifier-syntax">phrase_being_compiled</span><span class="plain-syntax">-></span><span class="element-syntax">type_data</span><span class="plain-syntax">));</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">allow_me</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ALWAYS_MATCH</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_nil</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &&</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_void</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">allow_me</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::compatible</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_supplied</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">mor</span><span class="plain-syntax"> == </span><span class="constant-syntax">DECIDES_CONDITION_MOR</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_supplied</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_truth_state</span><span class="plain-syntax">)))</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">allow_me</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ALWAYS_MATCH</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_7_1_1" class="named-paragraph-link"><span class="named-paragraph">Issue a problem for returning a value when none was asked</span><span class="named-paragraph-number">3.1.1.4.7.1.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">allow_me</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ALWAYS_MATCH</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="2-cfs.html#SP7" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">allow_me</span><span class="plain-syntax"> == </span><span class="identifier-syntax">SOMETIMES_MATCH</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Kinds::Behaviour::is_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">))) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">CHECKKINDRETURNED_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><a href="2-cfs.html#SP7" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Kinds::RunTime::I6_classname</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_1_1_4_7_1_2" class="named-paragraph-link"><span class="named-paragraph">Issue a problem for returning a value of the wrong kind</span><span class="named-paragraph-number">3.1.1.4.7.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">; </span><span class="comment-syntax"> that is, don't use the regular token compiler: we've done it ourselves</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4_7">§3.1.1.4.7</a>, <a href="5-cii.html#SP3_1_1_4_8">§3.1.1.4.8</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_7_1_1" class="paragraph-anchor"></a><b>§3.1.1.4.7.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue a problem for returning a value when none was asked</span><span class="named-paragraph-number">3.1.1.4.7.1.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_kind_of</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">returning_from_rule</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RuleNotAllowedOutcome</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1 as something to be a successful outcome of a rule, which "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"has the kind %2; but this is not a rule which is allowed to have a value "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"as its outcome."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RedundantReturnKOV</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1 as the outcome of a phrase, %2, but in the definition of "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"something which was not a phrase to decide a value."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4_7_1">§3.1.1.4.7.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_7_1_2" class="paragraph-anchor"></a><b>§3.1.1.4.7.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue a problem for returning a value of the wrong kind</span><span class="named-paragraph-number">3.1.1.4.7.1.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_kind</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">kind_supplied</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_kind</span><span class="plain-syntax">(3, </span><span class="identifier-syntax">kind_needed</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">returning_from_rule</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RuleOutcomeWrongKind</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1 as the outcome of a rule which produces a value, but this "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"was the wrong kind of value: %2 rather than %3."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_ReturnWrongKind</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1 as the outcome of a phrase to decide a value, but this was "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"the wrong kind of value: %2 rather than %3."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4_7_1">§3.1.1.4.7.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_9" class="paragraph-anchor"></a><b>§3.1.1.4.9. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "try-action"</span><span class="named-paragraph-number">3.1.1.4.9</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_CONSTANT_of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_stored_action</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">action_pattern</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ap</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_constant_action_pattern</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">PL::Actions::Patterns::emit_try</span><span class="plain-syntax">(</span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">STORED_ACTION_TY_TRY_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><a href="2-cfs.html#SP8" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_as_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_stored_action</span><span class="plain-syntax">, </span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">valid_annotation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">; </span><span class="comment-syntax"> that is, don't use the regular token compiler: we've done it ourselves</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_10" class="paragraph-anchor"></a><b>§3.1.1.4.10. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "try-action-silently"</span><span class="named-paragraph-number">3.1.1.4.10</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_CONSTANT_of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_stored_action</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">action_pattern</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ap</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_constant_action_pattern</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">PUSH_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">KEEP_SILENT_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">KEEP_SILENT_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">PUSH_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">SAY__P_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">PUSH_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">SAY__PC_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">CLEARPARAGRAPHING_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_truth_state</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">PL::Actions::Patterns::emit_try</span><span class="plain-syntax">(</span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">DIVIDEPARAGRAPHPOINT_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">PULL_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">SAY__PC_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">PULL_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">SAY__P_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">ADJUSTPARAGRAPHPOINT_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">PULL_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">KEEP_SILENT_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">STORED_ACTION_TY_TRY_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><a href="2-cfs.html#SP8" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_as_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_stored_action</span><span class="plain-syntax">, </span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_truth_state</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">valid_annotation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">; </span><span class="comment-syntax"> that is, don't use the regular token compiler: we've done it ourselves</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_11" class="paragraph-anchor"></a><b>§3.1.1.4.11. </b>Suppose we have a token which is a property name, and we want to know about
|
|
the kind of value the property holds. We can't simply take the kind of the
|
|
token, because that would be "property name". Instead:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "property-holds-block-value"</span><span class="named-paragraph-number">3.1.1.4.11</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_property</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">prn</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">Properties::is_either_or</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">))) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_truth_state</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Properties::Valued::kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_truth_state</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_truth_state</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_12" class="paragraph-anchor"></a><b>§3.1.1.4.12. </b>This little annotation is used for the phrases about timed rule firing:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To (R - rule) in (t - number) turn/turns from now: ...</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">has the inline definition:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> SetTimedEvent({-mark-event-used:R}, {t}+1, 0);</span>
|
|
</pre>
|
|
<p class="commentary">The annotation makes no difference to how R is compiled, except that it
|
|
sneaks in a sanity check (R must be explicitly named and must be an event
|
|
rule), and also makes a note for indexing purposes.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline annotation "mark-event-used"</span><span class="named-paragraph-number">3.1.1.4.12</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_CONSTANT_construction</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">, </span><span class="identifier-syntax">CON_rule</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_rule</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rules::get_I7_definition</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ph</span><span class="plain-syntax">) </span><a href="3-tp.html#SP4" class="function-link"><span class="function-syntax">Phrases::Timed::note_usage</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_NonconstantEvent</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but '%2' isn't the name of any timed event that "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I know of. (These need to be set up in a special way, like so - "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"'At the time when stuff happens: ...' creates a timed event "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"called 'stuff happens'.)"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">valid_annotation</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_1_1_4_13" class="paragraph-anchor"></a><b>§3.1.1.4.13. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Throw a problem message for an invalid inline annotation</span><span class="named-paragraph-number">3.1.1.4.13</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">command</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_BadInlineTag</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I attempted to compile %1 using its inline definition, "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"but this contained the invalid annotation '%2'."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_1_1_4">§3.1.1.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5" class="paragraph-anchor"></a><b>§3.5. High-level commands. </b>This category is intended for powerful and flexible commands, allowing for
|
|
invocations which behave like control statements in other languages. (See
|
|
also <span class="extract"><span class="extract-syntax">{-block}</span></span> above, though that is syntactically a divider rather than
|
|
a command, which is why it isn't here.)
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand a bracing containing a high-level command</span><span class="named-paragraph-number">3.5</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">my_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_1" class="named-paragraph-link"><span class="named-paragraph">Inline command "my"</span><span class="named-paragraph-number">3.5.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">unprotect_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_2" class="named-paragraph-link"><span class="named-paragraph">Inline command "unprotect"</span><span class="named-paragraph-number">3.5.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">copy_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_4" class="named-paragraph-link"><span class="named-paragraph">Inline command "copy"</span><span class="named-paragraph-number">3.5.4</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">initialise_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_3" class="named-paragraph-link"><span class="named-paragraph">Inline command "initialise"</span><span class="named-paragraph-number">3.5.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">matches_description_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_5" class="named-paragraph-link"><span class="named-paragraph">Inline command "matches-description"</span><span class="named-paragraph-number">3.5.5</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">now_matches_description_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_6" class="named-paragraph-link"><span class="named-paragraph">Inline command "now-matches-description"</span><span class="named-paragraph-number">3.5.6</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">arithmetic_operation_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_7" class="named-paragraph-link"><span class="named-paragraph">Inline command "arithmetic-operation"</span><span class="named-paragraph-number">3.5.7</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">say_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_8" class="named-paragraph-link"><span class="named-paragraph">Inline command "say"</span><span class="named-paragraph-number">3.5.8</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">show_me_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_9" class="named-paragraph-link"><span class="named-paragraph">Inline command "show-me"</span><span class="named-paragraph-number">3.5.9</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3">§3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_1" class="paragraph-anchor"></a><b>§3.5.1. </b>The <span class="extract"><span class="extract-syntax">{-my:name}</span></span> command creates a local variable for use in the invocation,
|
|
and then prints the variable's name. (If the same variable is created twice,
|
|
the second time it's simply printed.)
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "my"</span><span class="named-paragraph-number">3.5.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">) - </span><span class="character-syntax">'0'</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">n</span><span class="plain-syntax"> >= </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">n</span><span class="plain-syntax"> < </span><span class="constant-syntax">10</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_1_1" class="named-paragraph-link"><span class="named-paragraph">A single digit as the name</span><span class="named-paragraph-number">3.5.1.1</span></a></span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_1_2" class="named-paragraph-link"><span class="named-paragraph">An Inform 6 identifier as the name</span><span class="named-paragraph-number">3.5.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar_s</span><span class="plain-syntax"> = </span><a href="4-lv.html#SP46" class="function-link"><span class="function-syntax">LocalVariables::declare_this</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">8</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prim_cat</span><span class="plain-syntax"> == </span><span class="identifier-syntax">REF_PRIM_CAT</span><span class="plain-syntax">) </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">lvar_s</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">lvar_s</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5">§3.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_1_1" class="paragraph-anchor"></a><b>§3.5.1.1. </b>In the first form, we don't give an explicit name, but simply a digit from
|
|
0 to 9. We're therefore allowed to create up to 10 variables this way, and
|
|
the ones we create will be different from those made by any other invocation
|
|
(including other invocations of the same phrase). For example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To Throne Room (P - phrase):</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">which is a phrase to repeat a single phrase P twice, could be defined thus:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> (- for ({-my:1}=1; {-my:1}<=2; {-my:1}++) {P} -)</span>
|
|
</pre>
|
|
<p class="commentary">The variable lasts only until the end of the invocation. In general, given
|
|
this:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Throne Room say "Village.";</p>
|
|
</blockquote>
|
|
|
|
<blockquote>
|
|
<p>Throne Room say "Goons.";</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">...Inform will reallocate the same Inform 6 local as <span class="extract"><span class="extract-syntax">{-my:1}</span></span> in each
|
|
invocation, because it safely can. But if the phrase starts a code block,
|
|
as in a more elaborate loop, then the variable lasts for the lifetime of
|
|
that code block.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">A single digit as the name</span><span class="named-paragraph-number">3.5.1.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">] = </span><a href="4-lv.html#SP9" class="function-link"><span class="function-syntax">LocalVariables::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Set the kind of the my-variable</span><span class="named-paragraph-number">3.5.1.1.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-ptd.html#SP26" class="function-link"><span class="function-syntax">Phrases::TypeData::block_follows</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><a href="4-pb.html#SP18" class="function-link"><span class="function-syntax">Frames::Blocks::set_scope_to_block_about_to_open</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5_1">§3.5.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_1_2" class="paragraph-anchor"></a><b>§3.5.1.2. </b>The second form is simpler. <span class="extract"><span class="extract-syntax">{-my:1}</span></span> and such make locals with names like
|
|
<span class="extract"><span class="extract-syntax">tmp_3</span></span>, which we have no control over. Here we get to make a local with
|
|
exactly the name we want. This can't be reallocated, of course; it's there
|
|
throughout the routine, so there's no question of setting its scope.
|
|
For example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To be warned: ...</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">could be defined as:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> (- {-my:warn} = true; -)</span>
|
|
</pre>
|
|
<p class="commentary">and then
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To decide if we have been warned: ...</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">as
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> ({-my:warn})</span>
|
|
</pre>
|
|
<p class="commentary">the net result being that if either phrase is used, then <span class="extract"><span class="extract-syntax">warn</span></span> becomes a
|
|
local variable. The second phrase tests if the first has been used.
|
|
</p>
|
|
|
|
<p class="commentary">Nothing, of course, stops some other invocation from using a variable of
|
|
the same name for some quite different purpose, wreaking havoc. This is
|
|
why the numbered scheme above is mostly better.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">An Inform 6 identifier as the name</span><span class="named-paragraph-number">3.5.1.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><a href="4-lv.html#SP10" class="function-link"><span class="function-syntax">LocalVariables::add_internal_local</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Set the kind of the my-variable</span><span class="named-paragraph-number">3.5.1.1.1</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5_1">§3.5.1</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_1_1_1" class="paragraph-anchor"></a><b>§3.5.1.1.1. </b>Finally, it's possible to set the I7 kind of a variable created by <span class="extract"><span class="extract-syntax">{-my:...}</span></span>,
|
|
though there are hardly any circumstances where this is necessary, since I6
|
|
is typeless. But in a few cases where I7 is embedded inside I6 inside I7,
|
|
or when a block value is needed, or where we need to match against descriptions
|
|
(see below) where kind-checking comes into play, it could arise. For example:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> {-my:1:list of numbers}</span>
|
|
</pre>
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Set the kind of the my-variable</span><span class="named-paragraph-number">3.5.1.1.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="4-lv.html#SP37" class="function-link"><span class="function-syntax">LocalVariables::set_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5_1_1">§3.5.1.1</a>, <a href="5-cii.html#SP3_5_1_2">§3.5.1.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_2" class="paragraph-anchor"></a><b>§3.5.2. </b>Variables created by phrases are by default protected from being changed
|
|
by other phrases. So that, for example, within:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>repeat with X running from 1 to 5:</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">it's a problem message to say something like "let X be 7". This protection
|
|
only extends to changes made at the I7 source text level, of course; our own
|
|
I6 code can do anything it likes. Protection looks like a good idea,
|
|
especially for loop counters like X, but of course it would make phrases
|
|
like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>let Y be 2;</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">unable to make variables, only constants. So the <span class="extract"><span class="extract-syntax">{-unprotect:...}</span></span> command
|
|
lifts the protection on the variable named:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "unprotect"</span><span class="named-paragraph-number">3.5.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">v</span><span class="plain-syntax"> =</span>
|
|
<span class="plain-syntax"> </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lvalues::get_local_variable_if_any</span><span class="plain-syntax">(</span><span class="identifier-syntax">v</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) </span><a href="4-lv.html#SP38" class="function-link"><span class="function-syntax">LocalVariables::unprotect</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_2_1" class="named-paragraph-link"><span class="named-paragraph">Issue a no-such-local problem message</span><span class="named-paragraph-number">3.5.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5">§3.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_3" class="paragraph-anchor"></a><b>§3.5.3. </b>Something to be careful of is that a variable created with <span class="extract"><span class="extract-syntax">{-my:...}</span></span>,
|
|
or indeed a variable created explicitly by the phrase, may not begin with
|
|
contents which are typesafe for the kind you intend it to hold. Usually this
|
|
doesn't matter because it is immediately written with some value which is
|
|
indeed typesafe, and there's no problem. But if not, try using this:
|
|
<span class="extract"><span class="extract-syntax">{-initialise:var:kind}</span></span> takes the named local variable and gives it the
|
|
default value for that kind. If the kind is omitted, the default is to use
|
|
the kind of the variable. For example,
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> {-my:1:time}{-initialise:1}</span>
|
|
</pre>
|
|
<p class="commentary">Note that this works only for kinds of word value, like "time". For kinds
|
|
of block value, like "list of numbers", it does nothing. This may seem odd,
|
|
but the point is that locals of that kind are automatically set to their
|
|
default values when created, so they are always typesafe anyway.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "initialise"</span><span class="named-paragraph-number">3.5.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">V</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lvalues::get_local_variable_if_any</span><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-pb.html#SP14" class="function-link"><span class="function-syntax">Frames::Blocks::inside_a_loop_body</span></a><span class="plain-syntax">()) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">BLKVALUECOPY_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar_s</span><span class="plain-syntax"> = </span><a href="4-lv.html#SP46" class="function-link"><span class="function-syntax">LocalVariables::declare_this</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">8</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">lvar_s</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::RunTime::emit_default_value_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">), </span><span class="string-syntax">"value"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar_s</span><span class="plain-syntax"> = </span><a href="4-lv.html#SP46" class="function-link"><span class="function-syntax">LocalVariables::declare_this</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">8</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">lvar_s</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::RunTime::emit_default_value_as_val</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">), </span><span class="string-syntax">"value"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_kind</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_NoNaturalDefault</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"To achieve %1, we'd need to be able to store a default value of "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"the kind '%2', but there's no natural choice for this."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5">§3.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_4" class="paragraph-anchor"></a><b>§3.5.4. </b>The <span class="extract"><span class="extract-syntax">{-copy:...}</span></span> command allows us to copy the content in a token or
|
|
variable into any storage item (a local variable, a global, a table entry,
|
|
a list entry), regardless of its kind of value. For example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To let (t - nonexisting variable) be (u - value) (assignment operation): ...</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">is defined inline as:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> {-unprotect:t}{-copy:t:u}</span>
|
|
</pre>
|
|
<p class="commentary">This may look superfluous: for example, in response to
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>let X be 10;</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">it generates only something like:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> tmp_0 = 10;</span>
|
|
</pre>
|
|
<p class="commentary">which could have been achieved equally well with:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> {-unprotect:t}{t} = {u};</span>
|
|
</pre>
|
|
<p class="commentary">But it makes something much more elaborate in response to, say:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>let Y be the list of people in dark rooms;</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">where it's important to keep track of the allocation and deallocation of
|
|
dynamic lists, since Y is a block value not a word value. The point of the
|
|
<span class="extract"><span class="extract-syntax">{-copy:to:from}</span></span> command is to hide all that complexity from the definer.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "copy"</span><span class="named-paragraph-number">3.5.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">copy_form</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_4_1" class="named-paragraph-link"><span class="named-paragraph">Find what we are copying from, to and how</span><span class="named-paragraph-number">3.5.4.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_4_2" class="named-paragraph-link"><span class="named-paragraph">Check that we're not copying to something the user isn't allowed to change</span><span class="named-paragraph-number">3.5.4.2</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> </span><span class="identifier-syntax">pt1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Terms::new_constant</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">pcalc_term</span><span class="plain-syntax"> </span><span class="identifier-syntax">pt2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Terms::new_constant</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">storage_class</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lvalues::get_storage_form</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">copy_form</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_4_3" class="named-paragraph-link"><span class="named-paragraph">Check that increment or decrement make sense</span><span class="named-paragraph-number">3.5.4.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prototype</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lvalues::interpret_store</span><span class="plain-syntax">(</span><span class="identifier-syntax">storage_class</span><span class="plain-syntax">, </span><span class="identifier-syntax">K1</span><span class="plain-syntax">, </span><span class="identifier-syntax">K2</span><span class="plain-syntax">, </span><span class="identifier-syntax">copy_form</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"%s;"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prototype</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">KIND_CHECKING</span><span class="plain-syntax">, </span><span class="string-syntax">"Inline copy: %s\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prototype</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">BEGIN_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_ENTER</span><span class="plain-syntax">(</span><span class="constant-syntax">PERMIT_LOCALS_IN_TEXT_CMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::emit_expand_from_terms</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, &</span><span class="identifier-syntax">pt1</span><span class="plain-syntax">, &</span><span class="identifier-syntax">pt2</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">END_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5">§3.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_4_1" class="paragraph-anchor"></a><b>§3.5.4.1. </b>If the <span class="extract"><span class="extract-syntax">from</span></span> part is prefaced with a plus sign <span class="extract"><span class="extract-syntax">+</span></span>, the new value is added
|
|
to the current value rather than replacing it; if <span class="extract"><span class="extract-syntax">-</span></span>, it's subtracted. For
|
|
example,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To increase (S - storage) by (w - value) (assignment operation): ...</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">has the inline definition <span class="extract"><span class="extract-syntax">{-copy:S:+w}</span></span>. Lastly, it's also legal to write
|
|
just a <span class="extract"><span class="extract-syntax">+</span></span> or <span class="extract"><span class="extract-syntax">-</span></span> sign alone, which increments or decrements. Be wary here,
|
|
because <span class="extract"><span class="extract-syntax">{-copy:S:+}</span></span> adds 1 to S, whereas <span class="extract"><span class="extract-syntax">{-copy:S:+1}</span></span> adds the value
|
|
of the variable {-my:1} to S.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Find what we are copying from, to and how</span><span class="named-paragraph-number">3.5.4.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_p</span><span class="plain-syntax">)</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> == </span><span class="character-syntax">'+'</span><span class="plain-syntax">) { </span><span class="identifier-syntax">copy_form</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">; </span><span class="identifier-syntax">Str::copy_tail</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_p</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">); }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> == </span><span class="character-syntax">'-'</span><span class="plain-syntax">) { </span><span class="identifier-syntax">copy_form</span><span class="plain-syntax"> = -1; </span><span class="identifier-syntax">Str::copy_tail</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_p</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">); }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_p</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_p</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">copy_form</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::from_int</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_p</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from_p</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">to</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">from</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(5, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineCopy</span><span class="plain-syntax">), </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">owner</span><span class="plain-syntax">-></span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-></span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"The command to {-copy:...}, which asks to copy '%5' into '%4', has "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"gone wrong: I couldn't work those out."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">from_p</span><span class="plain-syntax">)</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5_4">§3.5.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_4_2" class="paragraph-anchor"></a><b>§3.5.4.2. </b>Use of <span class="extract"><span class="extract-syntax">{-copy:...}</span></span> will produce problem messages if the target is a protected
|
|
local variable, or a global which isn't allowed to change in play (such as the
|
|
story title).
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Check that we're not copying to something the user isn't allowed to change</span><span class="named-paragraph-number">3.5.4.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lvalues::get_nonlocal_variable_if_any</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">NonlocalVariables::must_be_constant</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">))) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) </span><span class="identifier-syntax">NonlocalVariables::warn_about_change</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lvalues::get_local_variable_if_any</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) && (</span><a href="4-lv.html#SP38" class="function-link"><span class="function-syntax">LocalVariables::protected</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">))) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5_4">§3.5.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_4_3" class="paragraph-anchor"></a><b>§3.5.4.3. </b>One can't, for example, increment a backdrop, or a text.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Check that increment or decrement make sense</span><span class="named-paragraph-number">3.5.4.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_quasinumerical</span><span class="plain-syntax">(</span><span class="identifier-syntax">K1</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_kind</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">K1</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_CantIncrementKind</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"To achieve %1, we'd need to be able to add or subtract 1 from "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"a value of the kind '%2', but there's no good way to do this."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5_4">§3.5.4</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_5" class="paragraph-anchor"></a><b>§3.5.5. </b>The next command generates code able to test if a token in the invocation,
|
|
or an I6 variable, matches a given description — which need not be constant.
|
|
For example,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To say a list of (OS - description of objects): ...</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">is defined in the Standard Rules thus:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> objectloop({-my:itm} ofclass Object)</span>
|
|
<span class="plain-syntax"> if ({-matches-description:itm:OS})</span>
|
|
<span class="plain-syntax"> give itm workflag2;</span>
|
|
<span class="plain-syntax"> else</span>
|
|
<span class="plain-syntax"> give itm ~workflag2;</span>
|
|
<span class="plain-syntax"> WriteListOfMarkedObjects(ENGLISH_BIT);</span>
|
|
</pre>
|
|
<p class="commentary">The whole "workflag" nonsense is Inform 6 convention from the stone age, but
|
|
the basic point here is that the loop does one thing if an object matches
|
|
the description and another if it doesn't. (In this example <span class="extract"><span class="extract-syntax">itm</span></span> was a
|
|
local I6 variable and <span class="extract"><span class="extract-syntax">OS</span></span> a token from the invocation, but these can be
|
|
mixed freely. Or we could use a single digit to refer to a numbered "my"
|
|
variable.)
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "matches-description"</span><span class="named-paragraph-number">3.5.5</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to_match</span><span class="plain-syntax"> =</span>
|
|
<span class="plain-syntax"> </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to_test</span><span class="plain-syntax"> =</span>
|
|
<span class="plain-syntax"> </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">to_test</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">to_match</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(5, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineMatchesDescription</span><span class="plain-syntax">), </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">owner</span><span class="plain-syntax">-></span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-></span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"The command {-matches-description:...}, which asks to test whether "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"'%5' is a valid description for '%4', has gone wrong: I couldn't "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"work those out."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><a href="2-dtd.html#SP20" class="function-link"><span class="function-syntax">Calculus::Deferrals::emit_substitution_test</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to_test</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_match</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5">§3.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_6" class="paragraph-anchor"></a><b>§3.5.6. </b>This is the same, except that it compiles code to assert that the given
|
|
variable matches the given description.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "now-matches-description"</span><span class="named-paragraph-number">3.5.6</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to_test</span><span class="plain-syntax"> =</span>
|
|
<span class="plain-syntax"> </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to_match</span><span class="plain-syntax"> =</span>
|
|
<span class="plain-syntax"> </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">to_test</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">to_match</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(5, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineNowMatchesDescription</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">owner</span><span class="plain-syntax">-></span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-></span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"The command {-now-matches-description:...}, which asks to change "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"'%4' so that '%5' becomes a valid description of it, has gone "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"wrong: I couldn't work those out."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><a href="2-dtd.html#SP21" class="function-link"><span class="function-syntax">Calculus::Deferrals::emit_substitution_now</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to_test</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_match</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5">§3.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_7" class="paragraph-anchor"></a><b>§3.5.7. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "arithmetic-operation"</span><span class="named-paragraph-number">3.5.7</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">op</span><span class="plain-syntax"> = </span><a href="3-ptd.html#SP26" class="function-link"><span class="function-syntax">Phrases::TypeData::arithmetic_operation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">binary</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Dimensions::arithmetic_op_is_unary</span><span class="plain-syntax">(</span><span class="identifier-syntax">op</span><span class="plain-syntax">)) </span><span class="identifier-syntax">binary</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">Y</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">KX</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">KY</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_7_1" class="named-paragraph-link"><span class="named-paragraph">Read the operands and their kinds</span><span class="named-paragraph-number">3.5.7.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="5-ca.html#SP1" class="function-link"><span class="function-syntax">Kinds::Compile::perform_arithmetic_emit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">op</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">KX</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">KY</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5">§3.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_7_1" class="paragraph-anchor"></a><b>§3.5.7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Read the operands and their kinds</span><span class="named-paragraph-number">3.5.7.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">KX</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">X</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">binary</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Y</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">KY</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">Y</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5_7">§3.5.7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_8" class="paragraph-anchor"></a><b>§3.5.8. </b>This prints a token or variable using the correct format for its kind. The
|
|
code below optimises this so that constant text is printed directly, rather
|
|
than stored as a constant text value and printed by a call to <span class="extract"><span class="extract-syntax">TEXT_TY_Say</span></span>:
|
|
this saves 2 words of memory and a function call at print time. But the
|
|
result would be the same without the optimisation.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "say"</span><span class="named-paragraph-number">3.5.8</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to_say</span><span class="plain-syntax"> =</span>
|
|
<span class="plain-syntax"> </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">to_say</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_2_1" class="named-paragraph-link"><span class="named-paragraph">Issue a no-such-local problem message</span><span class="named-paragraph-number">3.5.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><a href="5-cii.html#SP7" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand2</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Node::get_kind_variable_declarations</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">));</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_text</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_8_1" class="named-paragraph-link"><span class="named-paragraph">Inline say text</span><span class="named-paragraph-number">3.5.8.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_8_2" class="named-paragraph-link"><span class="named-paragraph">Inline say number</span><span class="named-paragraph-number">3.5.8.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_unicode_character</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_8_3" class="named-paragraph-link"><span class="named-paragraph">Inline say unicode character</span><span class="named-paragraph-number">3.5.8.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Kinds::Behaviour::get_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">BEGIN_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_EXIT</span><span class="plain-syntax">(</span><span class="constant-syntax">DEREFERENCE_POINTERS_CMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="2-cfs.html#SP7" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to_say</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">END_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_2_1_2" class="named-paragraph-link"><span class="named-paragraph">Issue an inline no-such-kind problem</span><span class="named-paragraph-number">3.2.1.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5">§3.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_8_1" class="paragraph-anchor"></a><b>§3.5.8.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline say text</span><span class="named-paragraph-number">3.5.8.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">SW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_say</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Rvalues::is_CONSTANT_of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_say</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_text</span><span class="plain-syntax">)) &&</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">) == </span><span class="constant-syntax">1</span><span class="plain-syntax">) &&</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">Vocabulary::test_flags</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">), </span><span class="identifier-syntax">TEXTWITHSUBS_MC</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">PRINT_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">CompiledText::from_wide_string_for_emission</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">Lexer::word_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">)));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">T</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_say</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">BEGIN_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_EXIT</span><span class="plain-syntax">(</span><span class="constant-syntax">DEREFERENCE_POINTERS_CMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Kinds::Behaviour::get_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><a href="2-cfs.html#SP7" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to_say</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">END_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5_8">§3.5.8</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_8_2" class="paragraph-anchor"></a><b>§3.5.8.2. </b>Numbers are also handled directly...
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline say number</span><span class="named-paragraph-number">3.5.8.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">PRINTNUMBER_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">SAY__N_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="2-cfs.html#SP7" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to_say</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5_8">§3.5.8</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_8_3" class="paragraph-anchor"></a><b>§3.5.8.3. </b>And similarly for Unicode characters. It would be tidier to abstract this
|
|
with a function call, but it would cost a function call.
|
|
</p>
|
|
|
|
<p class="commentary">Note that emitting a Unicode character requires different code on the Z-machine
|
|
to Glulx; we have to handle this within I6 conditional compilation blocks
|
|
because neither syntax will compile when I6 is compiling for the other VM.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline say unicode character</span><span class="named-paragraph-number">3.5.8.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">UNICODE_TEMP_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="2-cfs.html#SP7" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_to_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to_say</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TargetVMs::is_16_bit</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::vm</span><span class="plain-syntax">())) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_assembly</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">I</span><span class="string-syntax">"@print_unicode"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">UNICODE_TEMP_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_assembly</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">I</span><span class="string-syntax">"@streamunichar"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">UNICODE_TEMP_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5_8">§3.5.8</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_9" class="paragraph-anchor"></a><b>§3.5.9. </b>This is for debugging purposes only: it does the equivalent of the "showme"
|
|
phrase applied to the named variable.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "show-me"</span><span class="named-paragraph-number">3.5.9</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to_show</span><span class="plain-syntax"> =</span>
|
|
<span class="plain-syntax"> </span><a href="5-cii.html#SP6" class="function-link"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">to_show</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_5_2_1" class="named-paragraph-link"><span class="named-paragraph">Issue a no-such-local problem message</span><span class="named-paragraph-number">3.5.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">BEGIN_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_EXIT</span><span class="plain-syntax">(</span><span class="constant-syntax">DEREFERENCE_POINTERS_CMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">IFDEBUG_BIP</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">InternalTests::emit_showme</span><span class="plain-syntax">(</span><span class="identifier-syntax">to_show</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">END_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5">§3.5</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_6" class="paragraph-anchor"></a><b>§3.6. Miscellaneous commands. </b>These really have nothing in common, except that each can be used only in
|
|
very special circumstances.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand a bracing containing a miscellaneous command</span><span class="named-paragraph-number">3.6</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">segment_count_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_6_1" class="named-paragraph-link"><span class="named-paragraph">Inline command "segment-count"</span><span class="named-paragraph-number">3.6.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">final_segment_marker_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_6_2" class="named-paragraph-link"><span class="named-paragraph">Inline command "final-segment-marker"</span><span class="named-paragraph-number">3.6.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">list_together_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_6_3" class="named-paragraph-link"><span class="named-paragraph">Inline command "list-together"</span><span class="named-paragraph-number">3.6.3</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">rescale_ISINC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_6_4" class="named-paragraph-link"><span class="named-paragraph">Inline command "rescale"</span><span class="named-paragraph-number">3.6.4</span></a></span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3">§3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_6_1" class="paragraph-anchor"></a><b>§3.6.1. </b>These two are publicly documented, and have to do with multiple-segment
|
|
"say" phrases.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "segment-count"</span><span class="named-paragraph-number">3.6.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">ssp_segment_count_ANNOT</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_6">§3.6</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_6_2" class="paragraph-anchor"></a><b>§3.6.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "final-segment-marker"</span><span class="named-paragraph-number">3.6.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">ssp_closing_segment_wn_ANNOT</span><span class="plain-syntax">) == -1) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">NULL_HL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="string-syntax">"%~W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">ssp_closing_segment_wn_ANNOT</span><span class="plain-syntax">)));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T_s</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EmitInterSchemas::find_identifier_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">T_s</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_6">§3.6</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_6_3" class="paragraph-anchor"></a><b>§3.6.3. </b>This is a shim for an old Inform 6 library feature. It's used only to define
|
|
the "group... together" phrases.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "list-together"</span><span class="named-paragraph-number">3.6.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">unarticled_ISINSC</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ListTogether::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">articled_ISINSC</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ListTogether::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineListTogether</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">owner</span><span class="plain-syntax">-></span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-></span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"The only legal forms here are {-list-together:articled} and "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"{-list-together:unarticled}."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_6">§3.6</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_6_4" class="paragraph-anchor"></a><b>§3.6.4. </b>This exists to manage scaled arithmetic, and should only be used for the
|
|
mathematical definitions in the Standard Rules.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Inline command "rescale"</span><span class="named-paragraph-number">3.6.4</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_RescaleWithdrawn</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I attempted to compile %1 using its inline definition, "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"but this contained the invalid annotation '{-rescale:...}', "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"which has been withdrawn."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_6">§3.6</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_7" class="paragraph-anchor"></a><b>§3.7. Primitive definitions. </b>Some phrases are just too complicated to express in invocation language,
|
|
especially those involving complicated linguistic propositions. For example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To decide which arithmetic value is total (p - arithmetic value valued property) of (S - description of values): ...</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">has the inline definition:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> (- {-primitive-definition:total-of} -).</span>
|
|
</pre>
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand an entirely internal-made definition</span><span class="named-paragraph-number">3.7</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">repeat_through_ISINSC</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="2-dtd.html#SP23" class="function-link"><span class="function-syntax">Calculus::Deferrals::emit_repeat_through_domain_S</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[1],</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Lvalues::get_local_variable_if_any</span><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0]));</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">repeat_through_list_ISINSC</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="2-dtd.html#SP27" class="function-link"><span class="function-syntax">Calculus::Deferrals::emit_loop_over_list_S</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[1],</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Lvalues::get_local_variable_if_any</span><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0]));</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">number_of_ISINSC</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="2-dtd.html#SP14" class="function-link"><span class="function-syntax">Calculus::Deferrals::emit_number_of_S</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0]);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">random_of_ISINSC</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="2-dtd.html#SP17" class="function-link"><span class="function-syntax">Calculus::Deferrals::emit_random_of_S</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0]);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">total_of_ISINSC</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="2-dtd.html#SP19" class="function-link"><span class="function-syntax">Calculus::Deferrals::emit_total_of_S</span></a><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Rvalues::to_property</span><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0]), </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[1]);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">extremal_ISINSC</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">extremal_property_sign</span><span class="plain-syntax"> != </span><span class="identifier-syntax">MEASURE_T_EXACTLY</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">extremal_property</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><a href="2-dtd.html#SP22" class="function-link"><span class="function-syntax">Calculus::Deferrals::emit_extremal_of_S</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0],</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">extremal_property</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">extremal_property_sign</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineExtremal</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">owner</span><span class="plain-syntax">-></span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-></span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"In the '{-primitive-definition:extremal...}' command, there "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"should be a '<' or '>' sign then the name of a property."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">function_application_ISINSC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_7_1" class="named-paragraph-link"><span class="named-paragraph">Primitive "function-application"</span><span class="named-paragraph-number">3.7.1</span></a></span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">description_application_ISINSC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_7_2" class="named-paragraph-link"><span class="named-paragraph">Primitive "description-application"</span><span class="named-paragraph-number">3.7.2</span></a></span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">solve_equation_ISINSC</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-cii.html#SP3_7_3" class="named-paragraph-link"><span class="named-paragraph">Primitive "solve-equation"</span><span class="named-paragraph-number">3.7.3</span></a></span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">switch_ISINSC</span><span class="plain-syntax">) ;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">break_ISINSC</span><span class="plain-syntax">) </span><a href="4-pb.html#SP16" class="function-link"><span class="function-syntax">Frames::Blocks::emit_break</span></a><span class="plain-syntax">();</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">inline_subcommand</span><span class="plain-syntax"> == </span><span class="identifier-syntax">verbose_checking_ISINSC</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">what</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L</span><span class="string-syntax">""</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">tokens_count</span><span class="plain-syntax"> > </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">aspect</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0];</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">aspect</span><span class="plain-syntax">))) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">aw1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">aspect</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Word::dequote</span><span class="plain-syntax">(</span><span class="identifier-syntax">aw1</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">what</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lexer::word_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">aw1</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Dash::tracing_phrases</span><span class="plain-syntax">(</span><span class="identifier-syntax">what</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlinePrimitive</span><span class="plain-syntax">), </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">owner</span><span class="plain-syntax">-></span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-></span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I don't know any primitive definition called '%4'."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3">§3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_7_1" class="paragraph-anchor"></a><b>§3.7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Primitive "function-application"</span><span class="named-paragraph-number">3.7.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0];</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fn_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">fn</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">Y</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">fn_kind</span><span class="plain-syntax">) != </span><span class="identifier-syntax">CON_phrase</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_spec</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">fn</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineFunctionApplication</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">owner</span><span class="plain-syntax">-></span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-></span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"A function application only makes sense if the first token, "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"'%4', is a phrase: here it isn't."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_construction_material</span><span class="plain-syntax">(</span><span class="identifier-syntax">fn_kind</span><span class="plain-syntax">, &</span><span class="identifier-syntax">X</span><span class="plain-syntax">, &</span><span class="identifier-syntax">Y</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=1; </span><span class="identifier-syntax">i</span><span class="function-syntax"><tokens-></span><span class="element-syntax">tokens_count</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">-1] = </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">head</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">tail</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_construction_material</span><span class="plain-syntax">(</span><span class="identifier-syntax">X</span><span class="plain-syntax">, &</span><span class="identifier-syntax">head</span><span class="plain-syntax">, &</span><span class="identifier-syntax">tail</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tail</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">kind_required</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">-1] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Kinds::Behaviour::uses_pointer_values</span><span class="plain-syntax">(</span><span class="identifier-syntax">head</span><span class="plain-syntax">)) && (</span><span class="identifier-syntax">Kinds::Behaviour::definite</span><span class="plain-syntax">(</span><span class="identifier-syntax">head</span><span class="plain-syntax">)))</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">kind_required</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">-1] = </span><span class="identifier-syntax">head</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">tokens_count</span><span class="plain-syntax">--;</span>
|
|
|
|
<span class="plain-syntax"> </span><a href="5-ciac.html#SP2" class="function-link"><span class="function-syntax">Invocations::AsCalls::emit_function_call</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, -1, </span><span class="identifier-syntax">fn</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_7">§3.7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_7_2" class="paragraph-anchor"></a><b>§3.7.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Primitive "description-application"</span><span class="named-paragraph-number">3.7.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[1];</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[1] = </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0];</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0] = </span><span class="identifier-syntax">Rvalues::from_int</span><span class="plain-syntax">(-1, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">tokens_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="5-ciac.html#SP2" class="function-link"><span class="function-syntax">Invocations::AsCalls::emit_function_call</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, -1, </span><span class="identifier-syntax">fn</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_7">§3.7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_7_3" class="paragraph-anchor"></a><b>§3.7.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Primitive "solve-equation"</span><span class="named-paragraph-number">3.7.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_CONSTANT_of_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[1], </span><span class="identifier-syntax">K_equation</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Equations::emit_solution</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[0]),</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Rvalues::to_equation</span><span class="plain-syntax">(</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[1]));</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_SolvedNameless</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"only specific named equations can be solved"</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"not equations arrived at by further calculations or choices. (Sorry: "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"but there would be no safe way to determine when an equation could "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"be used, because all equations have differing natures and variables.)"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_7">§3.7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3_5_2_1" class="paragraph-anchor"></a><b>§3.5.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue a no-such-local problem message</span><span class="named-paragraph-number">3.5.2.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::inline_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_InlineNoSuch</span><span class="plain-syntax">), </span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">sche</span><span class="plain-syntax">-></span><span class="identifier-syntax">owner</span><span class="plain-syntax">-></span><span class="identifier-syntax">parent_schema</span><span class="plain-syntax">-></span><span class="identifier-syntax">converted_from</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I don't know any local variable called '%4'."</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="5-cii.html#SP3_5_2">§3.5.2</a>, <a href="5-cii.html#SP3_5_8">§3.5.8</a>, <a href="5-cii.html#SP3_5_9">§3.5.9</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. Parsing the invocation operands. </b>Two ways. First, as an identifier name, which stands for a local I6 variable
|
|
or for a token in the phrase being invoked. There are three ways we can
|
|
write this:
|
|
</p>
|
|
|
|
<ul class="items"><li>(a) the operands "0" to "9", a single digit, mean the <span class="extract"><span class="extract-syntax">{-my:...}</span></span> variables
|
|
with those numbers, if they exist;
|
|
</li><li>(b) otherwise if we have the name of a token in the phrase being invoked,
|
|
then the operand refers to its value in the current invocation;
|
|
</li><li>(c) and failing that we have the name of a local I6 variable.
|
|
</li></ul>
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_identifier</span></span>:<br/><a href="5-cii.html#SP3_5_2">§3.5.2</a>, <a href="5-cii.html#SP3_5_3">§3.5.3</a>, <a href="5-cii.html#SP3_5_4_1">§3.5.4.1</a>, <a href="5-cii.html#SP3_5_5">§3.5.5</a>, <a href="5-cii.html#SP3_5_6">§3.5.6</a>, <a href="5-cii.html#SP3_5_7_1">§3.5.7.1</a>, <a href="5-cii.html#SP3_5_8">§3.5.8</a>, <a href="5-cii.html#SP3_5_9">§3.5.9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="reserved-syntax">phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ph</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">tokens_packet</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tokens</span><span class="plain-syntax">, </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> **</span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">) >= </span><span class="character-syntax">'0'</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">) <= </span><span class="character-syntax">'9'</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">my_vars</span><span class="plain-syntax">[</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">) - </span><span class="character-syntax">'0'</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">LW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><a href="4-lv.html#SP23" class="function-link"><span class="function-syntax">LocalVariables::parse</span></a><span class="plain-syntax">(&(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-></span><span class="element-syntax">stack_frame</span><span class="plain-syntax">), </span><span class="identifier-syntax">LW</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tok</span><span class="plain-syntax"> = </span><a href="4-lv.html#SP8" class="function-link"><span class="function-syntax">LocalVariables::get_parameter_number</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tok</span><span class="plain-syntax"> >= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">tokens</span><span class="plain-syntax">-></span><span class="element-syntax">args</span><span class="plain-syntax">[</span><span class="identifier-syntax">tok</span><span class="plain-syntax">];</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><a href="4-lv.html#SP19" class="function-link"><span class="function-syntax">LocalVariables::by_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Lvalues::new_LOCAL_VARIABLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. </b>The second sort of operand is a kind.
|
|
</p>
|
|
|
|
<p class="commentary">If the kind named involves kind variables A, B, C, ..., then these are
|
|
substituted with their values in the context of the invocation being made.
|
|
In addition two special kind names are recognised:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> return-kind</span>
|
|
<span class="plain-syntax"> rule-return-kind</span>
|
|
</pre>
|
|
<p class="commentary">The former being the return kind from the phrase we are being invoked in
|
|
(if it's a phrase to decide a value), and the latter being the kind of value
|
|
which this rule should produce (if it's a rule, and if it's in a rulebook
|
|
which wants to produce a value). For example, you could define a phrase
|
|
which would safely abandon any attempt to define a value like this:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To give up deciding: (- return {-new:return-kind}; -).</p>
|
|
</blockquote>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Invocations::Inline::parse_bracing_operand_as_kind</span></span>:<br/><a href="5-cii.html#SP3_2_1">§3.2.1</a>, <a href="5-cii.html#SP3_2_2">§3.2.2</a>, <a href="5-cii.html#SP3_2_3">§3.2.3</a>, <a href="5-cii.html#SP3_2_4">§3.2.4</a>, <a href="5-cii.html#SP3_2_5">§3.2.5</a>, <a href="5-cii.html#SP3_2_6">§3.2.6</a>, <a href="5-cii.html#SP3_2_7">§3.2.7</a>, <a href="5-cii.html#SP3_2_8">§3.2.8</a>, <a href="5-cii.html#SP3_5_1_1_1">§3.5.1.1.1</a>, <a href="5-cii.html#SP3_5_3">§3.5.3</a>, <a href="5-cii.html#SP3_5_8">§3.5.8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_variable_declaration</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kvd</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"return-kind"</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="4-sf.html#SP8" class="function-link"><span class="function-syntax">Frames::get_kind_returned</span></a><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"rule-return-kind"</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Rulebooks::kind_from_context</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[27];</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><27; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (; </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">; </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">=</span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">) </span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">[</span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-></span><span class="identifier-syntax">kv_number</span><span class="plain-syntax">] = </span><span class="identifier-syntax">kvd</span><span class="plain-syntax">-></span><span class="identifier-syntax">kv_value</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="4-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kind_vars_inline</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">KW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">operand</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax"><s-type-expression></span><span class="plain-syntax">(</span><span class="identifier-syntax">KW</span><span class="plain-syntax">)) </span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="function-syntax"><<rp>></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="4-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::temporarily_set_kvs</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. I7 expression evaluation. </b>This is not quite like regular expression evaluation, because we want
|
|
"room" and "lighted" to be evaluated as the I6 translation of the
|
|
relevant class or property, rather than as code to test the predicate
|
|
"X is a room" or "X is lighted", and similarly for bare names
|
|
of defined adjectives. So:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::Inline::compile_I7_expression_from_text</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Invocations::Inline::compile_I7_expression_from_text</span></span>:<br/><a href="5-cii.html#SP2">§2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">VH</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">VH</span><span class="plain-syntax">-></span><span class="identifier-syntax">vhmode_wanted</span><span class="plain-syntax"> == </span><span class="identifier-syntax">INTER_VOID_VHMODE</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::evaluation</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><a href="5-cii.html#SP8" class="function-link"><span class="function-syntax">Invocations::Inline::compile_I7_expression_from_text_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">VH</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">VH</span><span class="plain-syntax">-></span><span class="identifier-syntax">vhmode_wanted</span><span class="plain-syntax"> == </span><span class="identifier-syntax">INTER_VOID_VHMODE</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::Inline::compile_I7_expression_from_text_inner</span><span class="plain-syntax">(</span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">LW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax"><property-name></span><span class="plain-syntax">(</span><span class="identifier-syntax">LW</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Properties::iname</span><span class="plain-syntax">(</span><span class="function-syntax"><<rp>></span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="string-syntax">"%n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Properties::iname</span><span class="plain-syntax">(</span><span class="function-syntax"><<rp>></span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax"><k-kind></span><span class="plain-syntax">(</span><span class="identifier-syntax">LW</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="function-syntax"><<rp>></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Kinds::RunTime::I6_classname</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="string-syntax">"%n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Kinds::RunTime::I6_classname</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Instances::parse_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">LW</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Instances::iname</span><span class="plain-syntax">(</span><span class="function-syntax"><<rp>></span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="string-syntax">"%~I"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">adjective</span><span class="plain-syntax"> *</span><span class="identifier-syntax">aph</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Adjectives::parse</span><span class="plain-syntax">(</span><span class="identifier-syntax">LW</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">aph</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Adjectives::Meanings::write_adjective_test_routine</span><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">aph</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::unlocated_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">BelievedImpossible</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"You tried to use '(+' and '+)' to expand to the Inform 6 routine "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"address of an adjective, but it was an adjective with no meaning."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">initial_problem_count</span><span class="plain-syntax"> = </span><span class="identifier-syntax">problem_count</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax"><s-value></span><span class="plain-syntax">(</span><span class="identifier-syntax">LW</span><span class="plain-syntax">)) </span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="function-syntax"><<rp>></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::new_UNKNOWN</span><span class="plain-syntax">(</span><span class="identifier-syntax">LW</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">initial_problem_count</span><span class="plain-syntax"> < </span><span class="identifier-syntax">problem_count</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Dash::check_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">initial_problem_count</span><span class="plain-syntax"> < </span><span class="identifier-syntax">problem_count</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">BEGIN_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">COMPILATION_MODE_EXIT</span><span class="plain-syntax">(</span><span class="constant-syntax">DEREFERENCE_POINTERS_CMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VH</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="2-cfs.html#SP8" class="function-link"><span class="function-syntax">Specifications::Compiler::emit_as_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NonlocalVariables::parse</span><span class="plain-syntax">(</span><span class="identifier-syntax">LW</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT</span><span class="plain-syntax">(</span><span class="identifier-syntax">URL_SYMBOL_CHAR</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter::SymbolsTables::symbol_to_url_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">InterNames::to_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">NonlocalVariables::iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">)));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT</span><span class="plain-syntax">(</span><span class="identifier-syntax">URL_SYMBOL_CHAR</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> </span><span class="identifier-syntax">VH2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Holsters::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTER_DATA_VHMODE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="2-cfs.html#SP5" class="function-link"><span class="function-syntax">Specifications::Compiler::compile_inner</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">VH2</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">v1</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Holsters::unholster_pair</span><span class="plain-syntax">(&</span><span class="identifier-syntax">VH2</span><span class="plain-syntax">, &</span><span class="identifier-syntax">v1</span><span class="plain-syntax">, &</span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">v1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ALIAS_IVAL</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT</span><span class="plain-syntax">(</span><span class="identifier-syntax">URL_SYMBOL_CHAR</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbols_table</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Inter::Packages::scope</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::current_enclosure</span><span class="plain-syntax">()-></span><span class="identifier-syntax">actual_package</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Inter::SymbolsTables::symbol_from_id</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter::SymbolsTables::symbol_to_url_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT</span><span class="plain-syntax">(</span><span class="identifier-syntax">URL_SYMBOL_CHAR</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">CodeGen::FC::val_from</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">Packaging::at</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">()), </span><span class="identifier-syntax">v1</span><span class="plain-syntax">, </span><span class="identifier-syntax">v2</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">END_COMPILATION_MODE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<nav role="progress"><div class="progresscontainer">
|
|
<ul class="progressbar"><li class="progressprev"><a href="5-ciac.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-cfs.html">2</a></li><li class="progresschapter"><a href="3-itp.html">3</a></li><li class="progresschapter"><a href="4-lv.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-inv.html">inv</a></li><li class="progresssection"><a href="5-pi.html">pi</a></li><li class="progresssection"><a href="5-ci.html">ci</a></li><li class="progresssection"><a href="5-ciac.html">ciac</a></li><li class="progresscurrent">cii</li><li class="progresssection"><a href="5-cp.html">cp</a></li><li class="progresssection"><a href="5-ca.html">ca</a></li><li class="progressnext"><a href="5-cp.html">❯</a></li></ul></div>
|
|
</nav><!--End of weave-->
|
|
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|