1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-26 04:00:43 +03:00

Removed need for kind template delays

This commit is contained in:
Graham Nelson 2020-07-31 11:47:30 +01:00
parent cf23bc5b18
commit efd193fe2e
14 changed files with 385 additions and 199 deletions

View file

@ -201,7 +201,6 @@ most of these worker functions are in the <span class="extract"><span class="ext
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="26-pl.html#SP11" class="function-link"><span class="function-syntax">Plugins::Manage::start_plugins</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP8" class="function-link"><span class="function-syntax">Task::load_types</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="6-bp.html#SP45" class="function-link"><span class="function-syntax">BinaryPredicates::make_built_in</span></a><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="13-kak.html#SP6" class="function-link"><span class="function-syntax">Kinds::Knowledge::include_templates_for_kinds</span></a><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="1-wtc.html#SP4" class="function-link"><span class="function-syntax">Task::advance_stage_to</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SEMANTIC_I_CSEQ</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Semantic analysis Ib"</span><span class="plain-syntax">, -1);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="3-bv.html#SP1" class="function-link"><span class="function-syntax">BootVerbs::bootstrap</span></a><span class="plain-syntax">)</span>

File diff suppressed because one or more lines are too long

View file

@ -230,10 +230,6 @@ kinds:
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Knowledge::move_within</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sub</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">super</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="16-is.html#SP15" class="function-link"><span class="function-syntax">InferenceSubjects::falls_within</span></a><span class="plain-syntax">(</span><a href="13-kak.html#SP1" class="function-link"><span class="function-syntax">Kinds::Knowledge::as_subject</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sub</span><span class="plain-syntax">), </span><a href="13-kak.html#SP1" class="function-link"><span class="function-syntax">Kinds::Knowledge::as_subject</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">super</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">Kinds::Knowledge::include_templates_for_kinds</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Kinds::Knowledge::include_templates_for_kinds</span></span>:<br/>How To Compile - <a href="1-htc.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::Interpreter::include_templates_for_kinds</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. Problems with kinds. </b></p>

237
docs/core-module/15-ps.html Normal file
View file

@ -0,0 +1,237 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Property Sentences</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="index.html"><span class="selectedlink">core</span></a></li>
<li><a href="../kinds-module/index.html">kinds</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="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</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="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Property Sentences' 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">core</a></li><li><a href="index.html#15">Chapter 15: Properties</a></li><li><b>Property Sentences</b></li></ul></div>
<p class="purpose">To examine assertion sentences for property creation.</p>
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b>Inform's syntax for value properties is "X of Y": "the carrying capacity
of the box", say. Because of this, the word "of" is structurally significant
when diagramming assertion sentences. Unfortunately "of" also occurs in many
other situations:
</p>
<blockquote>
<p>Yett of Ptarmigan is a room.</p>
</blockquote>
<p class="commentary">(It's a lookout point on the West Highland Way, not far from the village of
Milton of Buchanan.) We therefore want to subdivide the parse tree at "of"
only when it is preceded by a property name, but this means we need to know
the property names early in Inform's run.
</p>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b>We therefore look for this configuration:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> SENTENCE_NT "A container has a number called volume"</span>
<span class="plain-syntax"> VERB_NT "has"</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT "container"</span>
<span class="plain-syntax"> CALLED_NT "called"</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT "number"</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT "volume"</span>
</pre>
<p class="commentary">...and then extract the bottom-most, rightmost noun-phrase as the name of
a new property. It's sufficient to create it with no other details; the
sentence will be properly parsed later on.
</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">PropertySentences::look_for_property_creation</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">PropertySentences::look_for_property_creation</span></span>:<br/>Classifying Sentences - <a href="3-cs.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) == </span><span class="identifier-syntax">VERB_NT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> &amp;&amp; (</span><a href="9-tfa.html#SP9" class="function-link"><span class="function-syntax">Assertions::Traverse::special</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> &amp;&amp; (</span><a href="9-tbath.html#SP3" class="function-link"><span class="function-syntax">Assertions::Copular::possessive</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">) == </span><span class="identifier-syntax">CALLED_NT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</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">apparent_subject</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</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">SW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">) == </span><span class="identifier-syntax">WITH_NT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</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">s1</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">apparent_subject</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</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">C</span><span class="plain-syntax"> = </span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span 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="plain-syntax"> </span><span class="identifier-syntax">SW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">s1</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">C</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">SW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">s1</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::last_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="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">PW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</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">&lt;prohibited-property-owners&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;has-properties-called-sentence-object&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">PW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>A tricky point in detecting property declarations is that they share the
syntax used for action, activity and rulebook variables. For instance:
</p>
<blockquote>
<p>The taking action has a number called the hazard level.</p>
</blockquote>
<p class="commentary">...creates not a property name but an action variable. Fortunately, the names
of such owners have a distinctive look to them:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;prohibited-property-owners&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;action-name-formal&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-name-formal&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;rulebook-name-formal&gt;</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="SP4"></a><b>&#167;4. </b>And this seems a good place to declare the grammar for our "formal names".
For instance, if we want to talk about the "taking" action in abstract as
a noun, we write it in the formal way "taking action".
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;action-name-formal&gt;</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="Preform-constant-syntax">action</span>
<span class="Preform-function-syntax">&lt;activity-name-formal&gt;</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="Preform-constant-syntax">activity</span>
<span class="Preform-function-syntax">&lt;relation-name-formal&gt;</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="Preform-constant-syntax">relation</span>
<span class="Preform-function-syntax">&lt;rule-name-formal&gt;</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="Preform-constant-syntax">rule</span>
<span class="Preform-function-syntax">&lt;rulebook-name-formal&gt;</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="Preform-constant-syntax">rulebook</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"></a><b>&#167;5. </b>Assuming the owner passes that sanity check, the following grammar is then
applied to the presumed property name: note the side-effect of the final
production of &lt;has-property-name&gt;.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;has-properties-called-sentence-object&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;has-property-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;has-property-name-tail&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;has-property-name&gt;</span>
<span class="Preform-function-syntax">&lt;has-property-name-tail&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{_and}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;has-properties-called-sentence-object&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{_,/and}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;has-properties-called-sentence-object&gt;</span>
<span class="Preform-function-syntax">&lt;has-property-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;article&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="15-ps.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_PropertyCalledArticle problem</span><span class="named-paragraph-number">5.1</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">presence</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="15-ps.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">Issue PM_PropertyCalledPresence problem</span><span class="named-paragraph-number">5.2</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="15-ps.html#SP5_3" class="named-paragraph-link"><span class="named-paragraph">Issue PM_PropertyNameForbidden problem</span><span class="named-paragraph-number">5.3</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;quoted-text&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="15-ps.html#SP5_3" class="named-paragraph-link"><span class="named-paragraph">Issue PM_PropertyNameForbidden problem</span><span class="named-paragraph-number">5.3</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, Properties::Valued::obtain(W) }</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP5_1"></a><b>&#167;5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_PropertyCalledArticle problem</span><span class="named-paragraph-number">5.1</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">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_PropertyCalledArticle</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a property name cannot consist only of an article"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which this one seems to. It would lead to awful ambiguities. "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"More likely, the end of the sentence has been lost somehow?"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { </span><span class="constant-syntax">0</span><span class="plain-syntax">, - }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="15-ps.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5_2"></a><b>&#167;5.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_PropertyCalledPresence problem</span><span class="named-paragraph-number">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">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_PropertyCalledPresence</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a property name cannot consist only of the word 'presence'"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"because this would lead to ambiguities with the rule clause "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"'...in the presence of...' (For instance, when writing something "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"like 'Instead of eating in the presence of the Queen: ...') "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The best way to fix this is probably to add another word or "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"two to the property name: 'stage presence', say, would be fine."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { </span><span class="constant-syntax">0</span><span class="plain-syntax">, - }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="15-ps.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5_3"></a><b>&#167;5.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_PropertyNameForbidden problem</span><span class="named-paragraph-number">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">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_PropertyNameForbidden</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a property name cannot contain quoted text or a comma"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which this one seems to. I think I must be misunderstanding: "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"possibly you've added a subordinate clause which I can't "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"make sense of?"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { </span><span class="constant-syntax">0</span><span class="plain-syntax">, - }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="15-ps.html#SP5">&#167;5</a> (twice).</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="15-vp.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-cm.html">1</a></li><li class="progresschapter"><a href="2-up.html">2</a></li><li class="progresschapter"><a href="3-bv.html">3</a></li><li class="progresschapter"><a href="4-its.html">4</a></li><li class="progresschapter"><a href="5-lp.html">5</a></li><li class="progresschapter"><a href="6-up.html">6</a></li><li class="progresschapter"><a href="7-ptu.html">7</a></li><li class="progresschapter"><a href="8-ef.html">8</a></li><li class="progresschapter"><a href="9-ita.html">9</a></li><li class="progresschapter"><a href="10-aots.html">10</a></li><li class="progresschapter"><a href="11-itpc.html">11</a></li><li class="progresschapter"><a href="12-ter.html">12</a></li><li class="progresschapter"><a href="13-kak.html">13</a></li><li class="progresschapter"><a href="14-sp.html">14</a></li><li class="progresscurrentchapter">15</li><li class="progresssection"><a href="15-pr.html">pr</a></li><li class="progresssection"><a href="15-ep.html">ep</a></li><li class="progresssection"><a href="15-vp.html">vp</a></li><li class="progresscurrent">ps</li><li class="progresssection"><a href="15-cp.html">cp</a></li><li class="progresssection"><a href="15-ia.html">ia</a></li><li class="progresssection"><a href="15-tpr.html">tpr</a></li><li class="progresssection"><a href="15-ma.html">ma</a></li><li class="progresssection"><a href="15-cr.html">cr</a></li><li class="progresssection"><a href="15-spr.html">spr</a></li><li class="progresssection"><a href="15-spr2.html">spr2</a></li><li class="progresssection"><a href="15-pov.html">pov</a></li><li class="progresssection"><a href="15-epv.html">epv</a></li><li class="progresschapter"><a href="16-is.html">16</a></li><li class="progresschapter"><a href="17-tl.html">17</a></li><li class="progresschapter"><a href="18-lc.html">18</a></li><li class="progresschapter"><a href="19-tc.html">19</a></li><li class="progresschapter"><a href="20-eq.html">20</a></li><li class="progresschapter"><a href="21-rl.html">21</a></li><li class="progresschapter"><a href="22-itp.html">22</a></li><li class="progresschapter"><a href="23-ad.html">23</a></li><li class="progresschapter"><a href="24-lv.html">24</a></li><li class="progresschapter"><a href="25-in.html">25</a></li><li class="progresschapter"><a href="26-fc.html">26</a></li><li class="progresschapter"><a href="27-hr.html">27</a></li><li class="progressnext"><a href="15-cp.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -388,11 +388,11 @@ I6 template files.
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">indexed_grey_if_empty</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">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">documentation_reference</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP24" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#DEFAULTS"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP21" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#DEFAULTS"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span 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">initialisation_macro</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP24" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">initialisation_macro</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP21" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">initialisation_macro</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-kc2.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_2"></a><b>&#167;7.2. </b>However, if we create our constructor as a subkind, like so:
@ -434,7 +434,7 @@ of the constructor:
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">dt_tag</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::get_name</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">Kinds::Constructors::get_name</span></span>:<br/><a href="2-kc2.html#SP9">&#167;9</a><br/>Kind Interpreter - <a href="2-ki.html#SP21">&#167;21</a><br/>Using Kinds - <a href="2-uk.html#SP1">&#167;1</a><br/>Describing Kinds - <a href="2-dk.html#SP15">&#167;15</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plural_form</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::get_name</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">Kinds::Constructors::get_name</span></span>:<br/><a href="2-kc2.html#SP9">&#167;9</a><br/>Kind Interpreter - <a href="2-ki.html#SP20">&#167;20</a><br/>Using Kinds - <a href="2-uk.html#SP1">&#167;1</a><br/>Describing Kinds - <a href="2-dk.html#SP15">&#167;15</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plural_form</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">dt_tag</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">noun</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">dt_tag</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nt</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::nominative</span><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">plural_form</span><span class="plain-syntax">);</span>
@ -552,8 +552,8 @@ require running macros in the kind interpreter:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::convert_to_unit</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::convert_to_unit</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">is_incompletely_defined</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP24" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#UNIT"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP21" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#UNIT"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-kc2.html#SP15" class="function-link"><span class="function-syntax">Kinds::Constructors::is_arithmetic</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="comment-syntax"> i.e., if it succeeded</span>
@ -562,11 +562,11 @@ require running macros in the kind interpreter:
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::convert_to_enumeration</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::convert_to_enumeration</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">is_incompletely_defined</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP24" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#ENUMERATION"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP21" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#ENUMERATION"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">linguistic</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP24" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#LINGUISTIC"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP21" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#LINGUISTIC"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-kc2.html#SP15" class="function-link"><span class="function-syntax">Kinds::Constructors::is_enumeration</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="comment-syntax"> i.e., if it succeeded</span>
@ -578,8 +578,8 @@ require running macros in the kind interpreter:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::convert_to_real</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::convert_to_real</span></span>:<br/>Using Kinds - <a href="2-uk.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP24" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#REAL"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP21" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"#REAL"</span><span class="plain-syntax">), </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. </b>A few base kinds are marked as "linguistic", which simply enables us to fence
@ -599,7 +599,7 @@ them tidily off in the index.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::arity</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::arity</span></span>:<br/>Kinds - <a href="2-knd.html#SP18">&#167;18</a>, <a href="2-knd.html#SP18_3">&#167;18.3</a>, <a href="2-knd.html#SP25">&#167;25</a><br/>Kind Checking - <a href="2-kc.html#SP12">&#167;12</a>, <a href="2-kc.html#SP15_5">&#167;15.5</a><br/>Kind Interpreter - <a href="2-ki.html#SP21">&#167;21</a><br/>Using Kinds - <a href="2-uk.html#SP3">&#167;3</a><br/>Describing Kinds - <a href="2-dk.html#SP13">&#167;13</a>, <a href="2-dk.html#SP13_1">&#167;13.1</a>, <a href="2-dk.html#SP25_3">&#167;25.3</a>, <a href="2-dk.html#SP25_3_2">&#167;25.3.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Constructors::arity</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Kinds::Constructors::arity</span></span>:<br/>Kinds - <a href="2-knd.html#SP18">&#167;18</a>, <a href="2-knd.html#SP18_3">&#167;18.3</a>, <a href="2-knd.html#SP25">&#167;25</a><br/>Kind Checking - <a href="2-kc.html#SP12">&#167;12</a>, <a href="2-kc.html#SP15_5">&#167;15.5</a><br/>Kind Interpreter - <a href="2-ki.html#SP20">&#167;20</a><br/>Using Kinds - <a href="2-uk.html#SP3">&#167;3</a><br/>Describing Kinds - <a href="2-dk.html#SP13">&#167;13</a>, <a href="2-dk.html#SP13_1">&#167;13.1</a>, <a href="2-dk.html#SP25_3">&#167;25.3</a>, <a href="2-dk.html#SP25_3_2">&#167;25.3.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">con</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">group</span><span class="plain-syntax"> == </span><span class="constant-syntax">PROPER_CONSTRUCTOR_GRP</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constructor_arity</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>

View file

@ -66,7 +66,7 @@ function togglePopup(material_id) {
<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">kinds</a></li><li><a href="index.html#2">Chapter 2: Kinds</a></li><li><b>Kind Interpreter</b></li></ul></div>
<p class="purpose">To read in details of the built-in kinds from template files, setting them up ready for use.</p>
<ul class="toc"><li><a href="2-ki.html#SP1">&#167;1. Definitions</a></li><li><a href="2-ki.html#SP12">&#167;12. Errors and limitations</a></li><li><a href="2-ki.html#SP13">&#167;13. Setting up the interpreter</a></li><li><a href="2-ki.html#SP14">&#167;14. The kind command despatcher</a></li><li><a href="2-ki.html#SP15">&#167;15. Parsing single kind commands</a></li><li><a href="2-ki.html#SP16">&#167;16. Source text templates</a></li><li><a href="2-ki.html#SP22">&#167;22. Type macros</a></li><li><a href="2-ki.html#SP25">&#167;25. The kind text archiver</a></li><li><a href="2-ki.html#SP27">&#167;27. Error messages</a></li><li><a href="2-ki.html#SP28">&#167;28. Applying kind commands</a></li><li><a href="2-ki.html#SP29">&#167;29. Completing a batch</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="2-ki.html#SP1">&#167;1. Definitions</a></li><li><a href="2-ki.html#SP12">&#167;12. Errors and limitations</a></li><li><a href="2-ki.html#SP13">&#167;13. Setting up the interpreter</a></li><li><a href="2-ki.html#SP14">&#167;14. The kind command despatcher</a></li><li><a href="2-ki.html#SP15">&#167;15. Parsing single kind commands</a></li><li><a href="2-ki.html#SP16">&#167;16. Source text templates</a></li><li><a href="2-ki.html#SP21">&#167;21. Type macros</a></li><li><a href="2-ki.html#SP24">&#167;24. The kind text archiver</a></li><li><a href="2-ki.html#SP26">&#167;26. Error messages</a></li><li><a href="2-ki.html#SP27">&#167;27. Applying kind commands</a></li><li><a href="2-ki.html#SP28">&#167;28. Completing a batch</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
@ -327,7 +327,7 @@ colons.)
<span 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_last_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">) == </span><span class="character-syntax">':'</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::recording_a_kind_macro</span></a><span class="plain-syntax">()) </span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::end_kind_macro</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::recording_a_kind_macro</span></a><span class="plain-syntax">()) </span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::end_kind_macro</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_last_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">); </span><span class="comment-syntax"> remove the terminal colon</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP14_1" class="named-paragraph-link"><span class="named-paragraph">Deal with the heading at the top of a kind command block</span><span class="named-paragraph-number">14.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>
@ -335,8 +335,8 @@ colons.)
<span class="plain-syntax"> </span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax"> = </span><a href="2-ki.html#SP15" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_command</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::recording_a_kind_macro</span></a><span class="plain-syntax">()) </span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::record_into_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stc</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">constructor_described</span><span class="plain-syntax">) </span><a href="2-ki.html#SP28" class="function-link"><span class="function-syntax">Kinds::Interpreter::apply_kind_command</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">, </span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::recording_a_kind_macro</span></a><span class="plain-syntax">()) </span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::record_into_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">stc</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">constructor_described</span><span class="plain-syntax">) </span><a href="2-ki.html#SP27" class="function-link"><span class="function-syntax">Kinds::Interpreter::apply_kind_command</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">, </span><span class="identifier-syntax">constructor_described</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"kind command describes unspecified kind"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
@ -344,7 +344,7 @@ colons.)
</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">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">) == </span><span class="character-syntax">'#'</span><span class="plain-syntax">) </span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::begin_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span 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_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">) == </span><span class="character-syntax">'#'</span><span class="plain-syntax">) </span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::begin_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</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::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">) == </span><span class="character-syntax">'*'</span><span class="plain-syntax">) </span><a href="2-ki.html#SP18" class="function-link"><span class="function-syntax">Kinds::Interpreter::begin_kind_template</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</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">name</span><span class="plain-syntax">)</span>
@ -427,7 +427,7 @@ begin with those characters, but that doesn't matter for the things we need.
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1]);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Regexp::dispose_of</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</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-ki.html#SP27" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="string-syntax">"kind command without argument"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP26" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">whole_command</span><span class="plain-syntax">, </span><span class="string-syntax">"kind command without argument"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP15">&#167;15</a>.</li></ul>
@ -447,7 +447,7 @@ so we neglect it.
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">table_of_kind_commands</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP27" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"no such kind command"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP26" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"no such kind command"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_4"></a><b>&#167;15.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a boolean argument for a kind command</span><span class="named-paragraph-number">15.4</span></span><span class="comment-syntax"> =</span>
@ -456,7 +456,7 @@ so we neglect it.
<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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"yes"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_argument</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">else</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">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"no"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_argument</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><a href="2-ki.html#SP27" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"boolean kind command takes yes/no argument"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-ki.html#SP26" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"boolean kind command takes yes/no argument"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_5"></a><b>&#167;15.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a CCM argument for a kind command</span><span class="named-paragraph-number">15.5</span></span><span class="comment-syntax"> =</span>
@ -467,7 +467,7 @@ so we neglect it.
<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::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"literal"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = </span><span class="constant-syntax">LITERAL_CCM</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::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"quantitative"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = </span><span class="constant-syntax">NAMED_CONSTANT_CCM</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::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"special"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax"> = </span><span class="constant-syntax">SPECIAL_CCM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-ki.html#SP27" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"kind command with unknown constant-compilation-method"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-ki.html#SP26" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"kind command with unknown constant-compilation-method"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_6"></a><b>&#167;15.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a textual argument for a kind command</span><span class="named-paragraph-number">15.6</span></span><span class="comment-syntax"> =</span>
@ -486,7 +486,7 @@ so we neglect it.
<span class="plain-syntax"> </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">argument</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">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">30</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP27" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"too many words in kind command"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP26" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"too many words in kind command"</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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">vocabulary_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
</pre>
@ -517,16 +517,16 @@ so we neglect it.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</span><span class="plain-syntax"> = </span><a href="2-ki.html#SP17" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_template_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP27" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"unknown template name in kind command"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP26" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"unknown template name in kind command"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_11"></a><b>&#167;15.11. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse a macro name argument for a kind command</span><span class="named-paragraph-number">15.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">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</span><span class="plain-syntax"> = </span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</span><span class="plain-syntax"> = </span><a href="2-ki.html#SP21" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">argument</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP27" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"unknown template name in kind command"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP26" class="function-link"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"unknown template name in kind command"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP16"></a><b>&#167;16. Source text templates. </b>These are passages of I7 source text which can be inserted into the main
@ -609,50 +609,25 @@ called just once, with the single source text line.)
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-ki.html#SP17" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_template_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"duplicate definition of source text template"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax"> = </span><a href="2-ki.html#SP17" class="function-link"><span class="function-syntax">Kinds::Interpreter::new_kind_template</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">template_text</span><span class="plain-syntax"> = </span><a href="2-ki.html#SP26" class="function-link"><span class="function-syntax">Kinds::Interpreter::begin_recording_kind_text</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">template_text</span><span class="plain-syntax"> = </span><a href="2-ki.html#SP25" class="function-link"><span class="function-syntax">Kinds::Interpreter::begin_recording_kind_text</span></a><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">Kinds::Interpreter::record_into_kind_template</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">Kinds::Interpreter::record_into_kind_template</span></span>:<br/><a href="2-ki.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP26" class="function-link"><span class="function-syntax">Kinds::Interpreter::record_kind_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">line</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP25" class="function-link"><span class="function-syntax">Kinds::Interpreter::record_kind_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">line</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">Kinds::Interpreter::end_kind_template</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::end_kind_template</span></span>:<br/><a href="2-ki.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">current_kind_template</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no stt currently recording"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP26" class="function-link"><span class="function-syntax">Kinds::Interpreter::end_recording_kind_text</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP25" class="function-link"><span class="function-syntax">Kinds::Interpreter::end_recording_kind_text</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_template</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="SP19"></a><b>&#167;19. </b>So much for recording a template. To "play back", we need to take its text
and squeeze it into the main source text, but there's a timing issue: when
we read kind commands it is very early in Inform's run, and the lexer may not
even have started yet. So we simply remember our intention to insert the text:
and squeeze it into the main source text.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">era_of_kind_template_transcription</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::remember_to_transcribe_spec_template</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::remember_to_transcribe_spec_template</span></span>:<br/><a href="2-ki.html#SP28_1">&#167;28.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ttd</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">era_of_kind_template_transcription</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP20" class="function-link"><span class="function-syntax">Kinds::Interpreter::transcribe_kind_template</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">ttd</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</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">kind_template_obligation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tto</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind_template_obligation</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tto</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">remembered_template</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ttd</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tto</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">remembered_constructor</span><span class="plain-syntax"> = </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP20"></a><b>&#167;20. </b>...until now, when it's later on and the source text does indeed exist.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::include_templates_for_kinds</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_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">era_of_kind_template_transcription</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">kind_template_obligation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tto</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">tto</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_template_obligation</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP20" class="function-link"><span class="function-syntax">Kinds::Interpreter::transcribe_kind_template</span></a><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">tto</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">remembered_template</span><span class="plain-syntax">, </span><span class="identifier-syntax">tto</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">remembered_constructor</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">Kinds::Interpreter::transcribe_kind_template</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::transcribe_kind_template</span></span>:<br/><a href="2-ki.html#SP19">&#167;19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::transcribe_kind_template</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::transcribe_kind_template</span></span>:<br/><a href="2-ki.html#SP27_1">&#167;27.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_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="reserved-syntax">kind_template_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ttd</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ttd</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to transcribe missing source text template"</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">CORE_MODULE</span>
@ -665,7 +640,7 @@ even have started yet. So we simply remember our intention to insert the text:
<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">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-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">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-syntax">' '</span><span class="plain-syntax">)) { </span><span class="identifier-syntax">i</span><span class="plain-syntax">++; </span><span class="reserved-syntax">continue</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">template_line_buffer</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">terminator</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP20_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe one line of the template into the line buffer</span><span class="named-paragraph-number">20.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP19_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe one line of the template into the line buffer</span><span class="named-paragraph-number">19.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">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</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">XW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">terminator</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">Sentences::make_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">XW</span><span class="plain-syntax">, </span><span class="identifier-syntax">terminator</span><span class="plain-syntax">);</span>
@ -674,7 +649,7 @@ even have started yet. So we simply remember our intention to insert the text:
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP20_1"></a><b>&#167;20.1. </b>Inside template text, anything in angle brackets &lt;...&gt; is a wildcard.
<p class="commentary firstcommentary"><a id="SP19_1"></a><b>&#167;19.1. </b>Inside template text, anything in angle brackets &lt;...&gt; is a wildcard.
These cannot be nested and cannot include newlines. All other material is
copied verbatim into the line buffer.
</p>
@ -684,7 +659,7 @@ particular we wouldn't recognise a stop inside quoted matter. This does
not matter, since such things never come into kind definitions.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe one line of the template into the line buffer</span><span class="named-paragraph-number">20.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe one line of the template into the line buffer</span><span class="named-paragraph-number">19.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -695,7 +670,7 @@ not matter, since such things never come into kind definitions.
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="character-syntax">'\n'</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) != </span><span class="character-syntax">'&gt;'</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">++));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP20_1_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe the template wildcard</span><span class="named-paragraph-number">20.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP19_1_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe the template wildcard</span><span class="named-paragraph-number">19.1.1</span></a></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">template_wildcard_buffer</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">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">++));</span>
<span class="plain-syntax"> }</span>
@ -706,67 +681,67 @@ not matter, since such things never come into kind definitions.
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_last_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">); </span><span class="identifier-syntax">terminator</span><span class="plain-syntax"> = </span><span class="character-syntax">':'</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP20">&#167;20</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP20_1_1"></a><b>&#167;20.1.1. </b>Only five wildcards are recognised:
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP19">&#167;19</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP19_1_1"></a><b>&#167;19.1.1. </b>Only five wildcards are recognised:
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the template wildcard</span><span class="named-paragraph-number">20.1.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the template wildcard</span><span class="named-paragraph-number">19.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">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">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"kind"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP20_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's name</span><span class="named-paragraph-number">20.1.1.1</span></a></span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP19_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's name</span><span class="named-paragraph-number">19.1.1.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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"lower-case-kind"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP20_1_1_2" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's name in lower case</span><span class="named-paragraph-number">20.1.1.2</span></a></span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP19_1_1_2" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's name in lower case</span><span class="named-paragraph-number">19.1.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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"kind-weak-ID"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP20_1_1_3" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's weak ID</span><span class="named-paragraph-number">20.1.1.3</span></a></span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP19_1_1_3" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's weak ID</span><span class="named-paragraph-number">19.1.1.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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"printing-routine"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP20_1_1_4" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's I6 printing routine</span><span class="named-paragraph-number">20.1.1.4</span></a></span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP19_1_1_4" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's I6 printing routine</span><span class="named-paragraph-number">19.1.1.4</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">Str::eq_wide_string</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_wildcard_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"comparison-routine"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP20_1_1_5" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's I6 comparison routine</span><span class="named-paragraph-number">20.1.1.5</span></a></span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP19_1_1_5" class="named-paragraph-link"><span class="named-paragraph">Transcribe the kind's I6 comparison routine</span><span class="named-paragraph-number">19.1.1.5</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no such source text template wildcard"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP20_1">&#167;20.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP20_1_1_1"></a><b>&#167;20.1.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's name</span><span class="named-paragraph-number">20.1.1.1</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP19_1">&#167;19.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP19_1_1_1"></a><b>&#167;19.1.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's name</span><span class="named-paragraph-number">19.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><a href="2-ki.html#SP21" class="function-link"><span class="function-syntax">Kinds::Interpreter::transcribe_constructor_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP20" class="function-link"><span class="function-syntax">Kinds::Interpreter::transcribe_constructor_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</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="2-ki.html#SP20_1_1">&#167;20.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP20_1_1_2"></a><b>&#167;20.1.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's name in lower case</span><span class="named-paragraph-number">20.1.1.2</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP19_1_1">&#167;19.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP19_1_1_2"></a><b>&#167;19.1.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's name in lower case</span><span class="named-paragraph-number">19.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><a href="2-ki.html#SP21" class="function-link"><span class="function-syntax">Kinds::Interpreter::transcribe_constructor_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP20" class="function-link"><span class="function-syntax">Kinds::Interpreter::transcribe_constructor_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</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="2-ki.html#SP20_1_1">&#167;20.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP20_1_1_3"></a><b>&#167;20.1.1.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's weak ID</span><span class="named-paragraph-number">20.1.1.3</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP19_1_1">&#167;19.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP19_1_1_3"></a><b>&#167;19.1.1.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's weak ID</span><span class="named-paragraph-number">19.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="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="string-syntax">"%d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">weak_kind_ID</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP20_1_1">&#167;20.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP20_1_1_4"></a><b>&#167;20.1.1.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's I6 printing routine</span><span class="named-paragraph-number">20.1.1.4</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP19_1_1">&#167;19.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP19_1_1_4"></a><b>&#167;19.1.1.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's I6 printing routine</span><span class="named-paragraph-number">19.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="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">dt_I6_identifier</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP20_1_1">&#167;20.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP20_1_1_5"></a><b>&#167;20.1.1.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's I6 comparison routine</span><span class="named-paragraph-number">20.1.1.5</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP19_1_1">&#167;19.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP19_1_1_5"></a><b>&#167;19.1.1.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Transcribe the kind's I6 comparison routine</span><span class="named-paragraph-number">19.1.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="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">template_line_buffer</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">comparison_routine</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP20_1_1">&#167;20.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP21"></a><b>&#167;21. </b>Where:
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP19_1_1">&#167;19.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP20"></a><b>&#167;20. </b>Where:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::transcribe_constructor_name</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::transcribe_constructor_name</span></span>:<br/><a href="2-ki.html#SP20_1_1_1">&#167;20.1.1.1</a>, <a href="2-ki.html#SP20_1_1_2">&#167;20.1.1.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">lower_case</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::transcribe_constructor_name</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::transcribe_constructor_name</span></span>:<br/><a href="2-ki.html#SP19_1_1_1">&#167;19.1.1.1</a>, <a href="2-ki.html#SP19_1_1_2">&#167;19.1.1.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">lower_case</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">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">dt_tag</span><span class="plain-syntax">) </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="2-kc2.html#SP8" class="function-link"><span class="function-syntax">Kinds::Constructors::get_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">con</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">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
@ -787,21 +762,21 @@ not matter, since such things never come into kind definitions.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP22"></a><b>&#167;22. Type macros. </b>These are much simpler, and are just lists of kind commands grouped together
<p class="commentary firstcommentary"><a id="SP21"></a><b>&#167;21. Type macros. </b>These are much simpler, and are just lists of kind commands grouped together
under names.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> the one now being recorded</span>
<span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Interpreter::new_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::new_kind_macro</span></span>:<br/><a href="2-ki.html#SP23">&#167;23</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Interpreter::new_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::new_kind_macro</span></span>:<br/><a href="2-ki.html#SP22">&#167;22</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tmd</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tmd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_macro_line_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">tmd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_macro_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</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">tmd</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></span>:<br/><a href="2-ki.html#SP15_11">&#167;15.11</a>, <a href="2-ki.html#SP23">&#167;23</a><br/>Kind Constructors - <a href="2-kc2.html#SP7_1">&#167;7.1</a>, <a href="2-kc2.html#SP11">&#167;11</a>, <a href="2-kc2.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></span>:<br/><a href="2-ki.html#SP15_11">&#167;15.11</a>, <a href="2-ki.html#SP22">&#167;22</a><br/>Kind Constructors - <a href="2-kc2.html#SP7_1">&#167;7.1</a>, <a href="2-kc2.html#SP11">&#167;11</a>, <a href="2-kc2.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tmd</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">tmd</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_macro_definition</span><span 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</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">tmd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_macro_name</span><span class="plain-syntax">))</span>
@ -809,22 +784,22 @@ under names.
<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="SP23"></a><b>&#167;23. </b>And here once again is the code to record macros:
<p class="commentary firstcommentary"><a id="SP22"></a><b>&#167;22. </b>And here once again is the code to record macros:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::recording_a_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::recording_a_kind_macro</span></span>:<br/><a href="2-ki.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::recording_a_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::recording_a_kind_macro</span></span>:<br/><a href="2-ki.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::begin_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::begin_kind_macro</span></span>:<br/><a href="2-ki.html#SP14_1">&#167;14.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">))</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::begin_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::begin_kind_macro</span></span>:<br/><a href="2-ki.html#SP14_1">&#167;14.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-ki.html#SP21" class="function-link"><span class="function-syntax">Kinds::Interpreter::parse_kind_macro_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"duplicate definition of kind command macro"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax"> = </span><a href="2-ki.html#SP22" class="function-link"><span class="function-syntax">Kinds::Interpreter::new_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax"> = </span><a href="2-ki.html#SP21" class="function-link"><span class="function-syntax">Kinds::Interpreter::new_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</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">Kinds::Interpreter::record_into_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::record_into_kind_macro</span></span>:<br/><a href="2-ki.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::record_into_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::record_into_kind_macro</span></span>:<br/><a href="2-ki.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">current_kind_macro</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"kind macro not being recorded"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_KIND_MACRO_LENGTH</span><span class="plain-syntax">)</span>
@ -832,28 +807,28 @@ under names.
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_macro_line</span><span class="plain-syntax">[</span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax">++] = </span><span class="identifier-syntax">stc</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">Kinds::Interpreter::end_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::end_kind_macro</span></span>:<br/><a href="2-ki.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::end_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::end_kind_macro</span></span>:<br/><a href="2-ki.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">current_kind_macro</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"ended kind macro outside one"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_kind_macro</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="SP24"></a><b>&#167;24. </b>Playing back is easier, since it's just a matter of despatching the stored
<p class="commentary firstcommentary"><a id="SP23"></a><b>&#167;23. </b>Playing back is easier, since it's just a matter of despatching the stored
commands in sequence to the relevant kind.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></span>:<br/><a href="2-ki.html#SP28_1">&#167;28.1</a><br/>Kind Constructors - <a href="2-kc2.html#SP7_1">&#167;7.1</a>, <a href="2-kc2.html#SP11">&#167;11</a>, <a href="2-kc2.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">macro</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></span>:<br/><a href="2-ki.html#SP27_1">&#167;27.1</a><br/>Kind Constructors - <a href="2-kc2.html#SP7_1">&#167;7.1</a>, <a href="2-kc2.html#SP11">&#167;11</a>, <a href="2-kc2.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_macro_definition</span><span class="plain-syntax"> *</span><span class="identifier-syntax">macro</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">macro</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no such kind macro to play back"</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_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Macro %S on %S (%d lines)\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_macro_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_in_template_code</span><span class="plain-syntax">, </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_INDENT</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">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;macro-&gt;</span><span class="element-syntax">kind_macro_line_count</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP28" class="function-link"><span class="function-syntax">Kinds::Interpreter::apply_kind_command</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_macro_line</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP27" class="function-link"><span class="function-syntax">Kinds::Interpreter::apply_kind_command</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_macro_line</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_OUTDENT</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_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Macro %S ended\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_macro_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP25"></a><b>&#167;25. The kind text archiver. </b>Large chunks of the text in the template will need to exist permanently in
<p class="commentary firstcommentary"><a id="SP24"></a><b>&#167;24. The kind text archiver. </b>Large chunks of the text in the template will need to exist permanently in
memory, and we go into recording mode to accept a series of them,
concatenated with newlines dividing them, in a text stream.
</p>
@ -861,33 +836,33 @@ concatenated with newlines dividing them, in a text stream.
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP26"></a><b>&#167;26. </b>And here is recording mode:
<p class="commentary firstcommentary"><a id="SP25"></a><b>&#167;25. </b>And here is recording mode:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Interpreter::begin_recording_kind_text</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::begin_recording_kind_text</span></span>:<br/><a href="2-ki.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::Interpreter::begin_recording_kind_text</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::begin_recording_kind_text</span></span>:<br/><a href="2-ki.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind_recording</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">Kinds::Interpreter::record_kind_text</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::record_kind_text</span></span>:<br/><a href="2-ki.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::record_kind_text</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::record_kind_text</span></span>:<br/><a href="2-ki.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</span><span 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_recording</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"can't record outside recording"</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">kind_recording</span><span class="plain-syntax">, </span><span class="string-syntax">"%S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</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">Kinds::Interpreter::end_recording_kind_text</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::end_recording_kind_text</span></span>:<br/><a href="2-ki.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::end_recording_kind_text</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::end_recording_kind_text</span></span>:<br/><a href="2-ki.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_recording</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="SP27"></a><b>&#167;27. Error messages. </b></p>
<p class="commentary firstcommentary"><a id="SP26"></a><b>&#167;26. Error messages. </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">Kinds::Interpreter::kind_command_error</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></span>:<br/><a href="2-ki.html#SP15_2">&#167;15.2</a>, <a href="2-ki.html#SP15_3">&#167;15.3</a>, <a href="2-ki.html#SP15_4">&#167;15.4</a>, <a href="2-ki.html#SP15_5">&#167;15.5</a>, <a href="2-ki.html#SP15_7">&#167;15.7</a>, <a href="2-ki.html#SP15_10">&#167;15.10</a>, <a href="2-ki.html#SP15_11">&#167;15.11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">error</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::kind_command_error</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::kind_command_error</span></span>:<br/><a href="2-ki.html#SP15_2">&#167;15.2</a>, <a href="2-ki.html#SP15_3">&#167;15.3</a>, <a href="2-ki.html#SP15_4">&#167;15.4</a>, <a href="2-ki.html#SP15_5">&#167;15.5</a>, <a href="2-ki.html#SP15_7">&#167;15.7</a>, <a href="2-ki.html#SP15_10">&#167;15.10</a>, <a href="2-ki.html#SP15_11">&#167;15.11</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">error</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Kind command error found at: %S\n"</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">internal_error</span><span class="plain-syntax">(</span><span class="identifier-syntax">error</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP28"></a><b>&#167;28. Applying kind commands. </b>We take a single kind command and apply it to a given kind.
<p class="commentary firstcommentary"><a id="SP27"></a><b>&#167;27. Applying kind commands. </b>We take a single kind command and apply it to a given kind.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">apply_macro_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
@ -930,7 +905,7 @@ concatenated with newlines dividing them, in a text stream.
<span class="definition-keyword">define</span> <span class="constant-syntax">template_variable_number_KCC</span><span class="plain-syntax"> </span><span class="constant-syntax">40</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::apply_kind_command</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::apply_kind_command</span></span>:<br/><a href="2-ki.html#SP14">&#167;14</a>, <a href="2-ki.html#SP24">&#167;24</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::apply_kind_command</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Kinds::Interpreter::apply_kind_command</span></span>:<br/><a href="2-ki.html#SP14">&#167;14</a>, <a href="2-ki.html#SP23">&#167;23</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">single_kind_command</span><span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"null STC command"</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_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"apply: %s (%d/%d/%S/%S) to %d/%S\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text_of_command</span><span class="plain-syntax">,</span>
@ -940,37 +915,37 @@ concatenated with newlines dividing them, in a text stream.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tcc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">which_kind_command</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opcode_number</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP28_1" class="named-paragraph-link"><span class="named-paragraph">Apply kind macros or transcribe kind templates on request</span><span class="named-paragraph-number">28.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP27_1" class="named-paragraph-link"><span class="named-paragraph">Apply kind macros or transcribe kind templates on request</span><span class="named-paragraph-number">27.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP28_2" class="named-paragraph-link"><span class="named-paragraph">Most kind commands simply set a field in the constructor structure</span><span class="named-paragraph-number">28.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP28_3" class="named-paragraph-link"><span class="named-paragraph">A few kind commands contribute to linked lists in the constructor structure</span><span class="named-paragraph-number">28.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP28_4" class="named-paragraph-link"><span class="named-paragraph">And the rest fill in fields in the constructor structure in miscellaneous other ways</span><span class="named-paragraph-number">28.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP27_2" class="named-paragraph-link"><span class="named-paragraph">Most kind commands simply set a field in the constructor structure</span><span class="named-paragraph-number">27.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP27_3" class="named-paragraph-link"><span class="named-paragraph">A few kind commands contribute to linked lists in the constructor structure</span><span class="named-paragraph-number">27.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP27_4" class="named-paragraph-link"><span class="named-paragraph">And the rest fill in fields in the constructor structure in miscellaneous other ways</span><span class="named-paragraph-number">27.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"unimplemented kind command"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP28_1"></a><b>&#167;28.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply kind macros or transcribe kind templates on request</span><span class="named-paragraph-number">28.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP27_1"></a><b>&#167;27.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply kind macros or transcribe kind templates on request</span><span class="named-paragraph-number">27.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">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tcc</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">apply_template_KCC:</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP19" class="function-link"><span class="function-syntax">Kinds::Interpreter::remember_to_transcribe_spec_template</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP19" class="function-link"><span class="function-syntax">Kinds::Interpreter::transcribe_kind_template</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">template_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</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">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">apply_macro_KCC:</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP24" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ki.html#SP23" class="function-link"><span class="function-syntax">Kinds::Interpreter::play_back_kind_macro</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">macro_argument</span><span class="plain-syntax">, </span><span class="identifier-syntax">con</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="2-ki.html#SP28">&#167;28</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP28_2"></a><b>&#167;28.2. </b></p>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP27">&#167;27</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP27_2"></a><b>&#167;27.2. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="identifier-syntax">SET_BOOLEAN_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">field</span><span class="plain-syntax">) </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">field</span><span class="plain-syntax">##</span><span class="identifier-syntax">_KCC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">field</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">boolean_argument</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="definition-keyword">define</span> <span class="identifier-syntax">SET_INTEGER_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">field</span><span class="plain-syntax">) </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">field</span><span class="plain-syntax">##</span><span class="identifier-syntax">_KCC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">field</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">numeric_argument</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="definition-keyword">define</span> <span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">field</span><span class="plain-syntax">) </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">field</span><span class="plain-syntax">##</span><span class="identifier-syntax">_KCC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">field</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="definition-keyword">define</span> <span class="identifier-syntax">SET_CCM_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">field</span><span class="plain-syntax">) </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">field</span><span class="plain-syntax">##</span><span class="identifier-syntax">_KCC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">field</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">ccm_argument</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Most kind commands simply set a field in the constructor structure</span><span class="named-paragraph-number">28.2</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Most kind commands simply set a field in the constructor structure</span><span class="named-paragraph-number">27.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1003,8 +978,8 @@ concatenated with newlines dividing them, in a text stream.
<span class="plain-syntax"> </span><span class="identifier-syntax">SET_TEXTUAL_FIELD</span><span class="plain-syntax">(</span><span class="identifier-syntax">specification_text</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP28">&#167;28</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP28_3"></a><b>&#167;28.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">A few kind commands contribute to linked lists in the constructor structure</span><span class="named-paragraph-number">28.3</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP27">&#167;27</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP27_3"></a><b>&#167;27.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">A few kind commands contribute to linked lists in the constructor structure</span><span class="named-paragraph-number">27.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1038,14 +1013,14 @@ concatenated with newlines dividing them, in a text stream.
<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="2-ki.html#SP28">&#167;28</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP28_4"></a><b>&#167;28.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">And the rest fill in fields in the constructor structure in miscellaneous other ways</span><span class="named-paragraph-number">28.4</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP27">&#167;27</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP27_4"></a><b>&#167;27.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">And the rest fill in fields in the constructor structure in miscellaneous other ways</span><span class="named-paragraph-number">27.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">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tcc</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">constructor_arity_KCC:</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP28_4_1" class="named-paragraph-link"><span class="named-paragraph">Parse the constructor arity text</span><span class="named-paragraph-number">28.4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-ki.html#SP27_4_1" class="named-paragraph-link"><span class="named-paragraph">Parse the constructor arity text</span><span class="named-paragraph-number">27.4.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="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">description_KCC:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constructor_description</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">stc</span><span class="plain-syntax">.</span><span class="element-syntax">textual_argument</span><span class="plain-syntax">);</span>
@ -1107,8 +1082,8 @@ concatenated with newlines dividing them, in a text stream.
<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="2-ki.html#SP28">&#167;28</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP28_4_1"></a><b>&#167;28.4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse the constructor arity text</span><span class="named-paragraph-number">28.4.1</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP27">&#167;27</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP27_4_1"></a><b>&#167;27.4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse the constructor arity text</span><span class="named-paragraph-number">27.4.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1137,8 +1112,8 @@ concatenated with newlines dividing them, in a text stream.
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">con</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">constructor_arity</span><span class="plain-syntax"> = </span><span class="identifier-syntax">c</span><span class="plain-syntax">+1;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP28_4">&#167;28.4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP29"></a><b>&#167;29. Completing a batch. </b>At one time it was useful to do some mopping-up work after a round of kind
<ul class="endnotetexts"><li>This code is used in <a href="2-ki.html#SP27_4">&#167;27.4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP28"></a><b>&#167;28. Completing a batch. </b>At one time it was useful to do some mopping-up work after a round of kind
commands, so the following hook was devised; but at present it's not needed.
</p>
@ -1146,7 +1121,7 @@ commands, so the following hook was devised; but at present it's not needed.
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Interpreter::batch_done</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP30"></a><b>&#167;30. </b>And that completes the kind interpreter.
<p class="commentary firstcommentary"><a id="SP29"></a><b>&#167;29. </b>And that completes the kind interpreter.
</p>
<nav role="progress"><div class="progresscontainer">

View file

@ -391,7 +391,7 @@ we can then use that same pointer on all subsequent requests.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::base_construction</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Kinds::base_construction</span></span>:<br/><a href="2-knd.html#SP22">&#167;22</a>, <a href="2-knd.html#SP33">&#167;33</a><br/>Kind Constructors - <a href="2-kc2.html#SP3">&#167;3</a>, <a href="2-kc2.html#SP7">&#167;7</a>, <a href="2-kc2.html#SP7_1">&#167;7.1</a><br/>Kind Interpreter - <a href="2-ki.html#SP14_1">&#167;14.1</a>, <a href="2-ki.html#SP28_4">&#167;28.4</a><br/>Describing Kinds - <a href="2-dk.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::base_construction</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Kinds::base_construction</span></span>:<br/><a href="2-knd.html#SP22">&#167;22</a>, <a href="2-knd.html#SP33">&#167;33</a><br/>Kind Constructors - <a href="2-kc2.html#SP3">&#167;3</a>, <a href="2-kc2.html#SP7">&#167;7</a>, <a href="2-kc2.html#SP7_1">&#167;7.1</a><br/>Kind Interpreter - <a href="2-ki.html#SP14_1">&#167;14.1</a>, <a href="2-ki.html#SP27_4">&#167;27.4</a><br/>Describing Kinds - <a href="2-dk.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">con</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"impossible construction"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">con</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_KIND_VARIABLE</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">con</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_INTERMEDIATE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"forbidden construction"</span><span class="plain-syntax">);</span>
@ -944,7 +944,7 @@ it is. There is no need for speed here.
<span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Kinds::read_kind_marking_from_vocabulary</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">Kinds::read_kind_marking_from_vocabulary</span></span>:<br/>Describing Kinds - <a href="2-dk.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</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">ve</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">means</span><span class="plain-syntax">.</span><span class="identifier-syntax">one_word_kind</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">Kinds::mark_vocabulary_as_kind</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Kinds::mark_vocabulary_as_kind</span></span>:<br/>Kind Interpreter - <a href="2-ki.html#SP28_4">&#167;28.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::mark_vocabulary_as_kind</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Kinds::mark_vocabulary_as_kind</span></span>:<br/>Kind Interpreter - <a href="2-ki.html#SP27_4">&#167;27.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ve</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">means</span><span class="plain-syntax">.</span><span class="identifier-syntax">one_word_kind</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Vocabulary::set_flags</span><span class="plain-syntax">(</span><span class="identifier-syntax">ve</span><span class="plain-syntax">, </span><span class="constant-syntax">KIND_FAST_MC</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NTI::mark_vocabulary</span><span class="plain-syntax">(</span><span class="identifier-syntax">ve</span><span class="plain-syntax">, </span><span class="function-syntax">&lt;k-kind&gt;</span><span class="plain-syntax">);</span>

View file

@ -1,6 +1,6 @@
Total memory consumption was 257267K = 251 MB
62.5% was used for 1339945 objects, in 273670 frames in 201 x 800K = 160800K = 157 MB:
62.5% was used for 1339939 objects, in 273664 frames in 201 x 800K = 160800K = 157 MB:
9.8% inter_tree_node_array 36 x 8192 = 294912 objects, 25953408 bytes
5.5% text_stream_array 2579 x 100 = 257900 objects, 14524928 bytes
@ -8,7 +8,7 @@ Total memory consumption was 257267K = 251 MB
2.8% verb_conjugation 164 objects, 7610912 bytes
2.7% parse_node_annotation_array 445 x 500 = 222500 objects, 7134240 bytes
2.3% inter_symbol_array 70 x 1024 = 71680 objects, 6310080 bytes
1.8% linked_list 8930 objects, 5000800 bytes
1.8% linked_list 8929 objects, 5000240 bytes
1.3% pcalc_prop_array 24 x 1000 = 24000 objects, 3648768 bytes
1.1% map_data 660 objects, 3131040 bytes
0.9% kind_array 65 x 1000 = 65000 objects, 2602080 bytes
@ -93,7 +93,7 @@ Total memory consumption was 257267K = 251 MB
---- adjective_iname_holder 320 objects, 15360 bytes
---- plugin 23 objects, 13432 bytes
---- literal_text 147 objects, 12936 bytes
---- stopwatch_timer 155 objects, 12400 bytes
---- stopwatch_timer 154 objects, 12320 bytes
---- understanding_reference_array 2 x 100 = 200 objects, 11264 bytes
---- pathname 265 objects, 10600 bytes
---- adjective 137 objects, 9864 bytes
@ -161,40 +161,39 @@ Total memory consumption was 257267K = 251 MB
---- implication 13 objects, 728 bytes
---- rulebook_outcome 17 objects, 680 bytes
---- inform_language 6 objects, 672 bytes
---- relation_guard 5 objects, 640 bytes
---- inter_warehouse_room 10 objects, 640 bytes
---- I6T_intervention 8 objects, 640 bytes
---- inter_warehouse_room 10 objects, 640 bytes
---- relation_guard 5 objects, 640 bytes
---- nascent_array 7 objects, 616 bytes
---- inbuild_search_result 15 objects, 600 bytes
---- named_rulebook_outcome 15 objects, 600 bytes
---- inbuild_search_result 15 objects, 600 bytes
---- label_namespace 10 objects, 560 bytes
---- small_word_set 11 objects, 528 bytes
---- inform_kit 5 objects, 520 bytes
---- i6_memory_setting 13 objects, 416 bytes
---- equation 4 objects, 416 bytes
---- dval_written 10 objects, 400 bytes
---- i6_memory_setting 13 objects, 416 bytes
---- module_package 10 objects, 400 bytes
---- dval_written 10 objects, 400 bytes
---- article_usage 8 objects, 384 bytes
---- source_file 5 objects, 360 bytes
---- inbuild_genre 7 objects, 336 bytes
---- grammatical_category 8 objects, 320 bytes
---- door_dir_notice 5 objects, 320 bytes
---- grammatical_category 8 objects, 320 bytes
---- pronoun 8 objects, 320 bytes
---- build_step 4 objects, 288 bytes
---- door_to_notice 5 objects, 280 bytes
---- inform_pipeline 4 objects, 256 bytes
---- verb_usage_tier 5 objects, 240 bytes
---- test_scenario 1 object, 208 bytes
---- build_skill 5 objects, 200 bytes
---- compilation_module 5 objects, 200 bytes
---- kit_dependency 4 objects, 192 bytes
---- build_skill 5 objects, 200 bytes
---- plural_dictionary_entry 4 objects, 192 bytes
---- kit_dependency 4 objects, 192 bytes
---- inform_project 1 object, 176 bytes
---- pointer_allocation 2 objects, 160 bytes
---- kind_template_obligation 4 objects, 160 bytes
---- code_generation_target 4 objects, 160 bytes
---- inter_architecture 4 objects, 160 bytes
---- pointer_allocation 2 objects, 160 bytes
---- link_instruction 4 objects, 160 bytes
---- inter_architecture 4 objects, 160 bytes
---- codegen_pipeline 1 object, 128 bytes
---- element_activation 4 objects, 128 bytes
---- inbuild_nest 3 objects, 120 bytes
@ -212,9 +211,9 @@ Total memory consumption was 257267K = 251 MB
37.4% was used for memory not allocated for objects:
15.9% text stream storage 41937664 bytes in 264288 claims
15.9% text stream storage 41937428 bytes in 264287 claims
3.5% dictionary storage 9293824 bytes in 16401 claims
---- sorting 1104 bytes in 3 claims
---- sorting 1096 bytes in 3 claims
2.7% source text 7200000 bytes in 3 claims
4.0% source text details 10800000 bytes in 2 claims
---- linguistic stock array 81920 bytes in 2 claims
@ -229,5 +228,5 @@ Total memory consumption was 257267K = 251 MB
---- emitter array storage 14368 bytes in 8 claims
---- code generation workspace for objects 9200 bytes in 9 claims
20.1% was overhead - 53028040 bytes = 51785K = 50 MB
20.1% was overhead - 53028840 bytes = 51785K = 50 MB

View file

@ -1,14 +1,14 @@
100.0% in inform7 run
67.4% in compilation to Inter
26.7% in //Phrases::Manager::compile_first_block//
9.2% in //Phrases::Manager::compile_as_needed//
67.0% in compilation to Inter
26.2% in //Phrases::Manager::compile_first_block//
9.3% in //Phrases::Manager::compile_as_needed//
6.8% in //Strings::compile_responses//
5.8% in //World::Compile::compile//
3.1% in //Assertions::Traverse::traverse1//
3.1% in //Classifying::traverse//
2.0% in //Phrases::Manager::RulePrintingRule_routine//
2.0% in //Phrases::Manager::rulebooks_array//
1.1% in //NewVerbs::ConjugateVerb//
5.9% in //World::Compile::compile//
3.2% in //Assertions::Traverse::traverse1//
3.0% in //Classifying::traverse//
2.1% in //Phrases::Manager::RulePrintingRule_routine//
1.9% in //Phrases::Manager::rulebooks_array//
0.9% in //NewVerbs::ConjugateVerb//
0.7% in //Phrases::Manager::traverse//
0.5% in //Phrases::Manager::parse_rule_parameters//
0.3% in //Phrases::Manager::compile_rulebooks//
@ -19,11 +19,11 @@
0.1% in //Sentences::RuleSubtrees::register_recently_lexed_phrases//
0.1% in //Task::load_types//
0.1% in //World::complete//
4.1% not specifically accounted for
30.3% in running Inter pipeline
9.9% in step preparation
9.5% in inter step 2/12: link
7.1% in inter step 12/12: generate inform6 -> auto.inf
3.8% not specifically accounted for
30.8% in running Inter pipeline
10.1% in step preparation
9.7% in inter step 2/12: link
7.2% in inter step 12/12: generate inform6 -> auto.inf
0.3% in inter step 9/12: make-identifiers-unique
0.1% in inter step 10/12: reconcile-verbs
0.1% in inter step 11/12: eliminate-redundant-labels
@ -31,6 +31,5 @@
0.1% in inter step 6/12: assimilate
0.1% in inter step 7/12: resolve-external-symbols
0.1% in inter step 8/12: inspect-plugs
2.2% not specifically accounted for
2.0% in supervisor
0.2% not specifically accounted for
2.1% not specifically accounted for
2.1% in supervisor

View file

@ -0,0 +1,6 @@
The operator && means the numerically-greater-than relation.
To begin:
showme whether or not 10 && 5;
showme whether or not 10 && 15;
showme whether or not 10 && 10.

View file

@ -0,0 +1,4 @@
"whether or not 10 && 5" = truth state: true
"whether or not 10 && 15" = truth state: false
"whether or not 10 && 10" = truth state: false

View file

@ -125,7 +125,6 @@ most of these worker functions are in the |core| module, some are not.
BENCH(Plugins::Manage::start_plugins);
BENCH(Task::load_types);
BENCH(BinaryPredicates::make_built_in)
BENCH(Kinds::Knowledge::include_templates_for_kinds)
Task::advance_stage_to(SEMANTIC_I_CSEQ, I"Semantic analysis Ib", -1);
BENCH(BootVerbs::bootstrap)

View file

@ -154,10 +154,6 @@ void Kinds::Knowledge::move_within(kind *sub, kind *super) {
InferenceSubjects::falls_within(Kinds::Knowledge::as_subject(sub), Kinds::Knowledge::as_subject(super));
}
void Kinds::Knowledge::include_templates_for_kinds(void) {
Kinds::Interpreter::include_templates_for_kinds(Task::syntax_tree());
}
@h Problems with kinds.
@d KINDS_PROBLEM_HANDLER Kinds::Knowledge::kinds_problem_handler

View file

@ -475,33 +475,9 @@ void Kinds::Interpreter::end_kind_template(void) {
}
@ So much for recording a template. To "play back", we need to take its text
and squeeze it into the main source text, but there's a timing issue: when
we read kind commands it is very early in Inform's run, and the lexer may not
even have started yet. So we simply remember our intention to insert the text:
and squeeze it into the main source text.
=
int era_of_kind_template_transcription = FALSE;
void Kinds::Interpreter::remember_to_transcribe_spec_template(parse_node_tree *T, kind_template_definition *ttd, kind_constructor *C) {
if (era_of_kind_template_transcription) {
Kinds::Interpreter::transcribe_kind_template(T, ttd, C);
} else {
kind_template_obligation *tto = CREATE(kind_template_obligation);
tto->remembered_template = ttd;
tto->remembered_constructor = C;
}
}
@ ...until now, when it's later on and the source text does indeed exist.
=
void Kinds::Interpreter::include_templates_for_kinds(parse_node_tree *T) {
era_of_kind_template_transcription = TRUE;
kind_template_obligation *tto;
LOOP_OVER(tto, kind_template_obligation)
Kinds::Interpreter::transcribe_kind_template(T,
tto->remembered_template, tto->remembered_constructor);
}
void Kinds::Interpreter::transcribe_kind_template(parse_node_tree *T,
kind_template_definition *ttd, kind_constructor *con) {
if (ttd == NULL) internal_error("tried to transcribe missing source text template");
@ -767,7 +743,7 @@ void Kinds::Interpreter::apply_kind_command(parse_node_tree *T, single_kind_comm
@<Apply kind macros or transcribe kind templates on request@> =
switch (tcc) {
case apply_template_KCC:
Kinds::Interpreter::remember_to_transcribe_spec_template(T, stc.template_argument, con);
Kinds::Interpreter::transcribe_kind_template(T, stc.template_argument, con);
return;
case apply_macro_KCC:
Kinds::Interpreter::play_back_kind_macro(T, stc.macro_argument, con);