1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/core-module/26-i6i.html
2020-04-07 01:06:09 +01:00

401 lines
34 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>26/fc</title>
<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="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></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="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</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="../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="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '26/i6i' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#26">Chapter 26: Compilation Utilities</a></li><li><b>Inform 6 Inclusions</b></li></ul><p class="purpose">To include Inform 6 code almost verbatim in the output, as instructed by low-level Inform 7 sentences.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Inclusions are a very low-level language feature: rather like the way some
C compilers, such as <code class="display"><span class="extract">gcc</span></code>, allow assembly-language code to be inserted at
crucial points in the middle of C, so Inform 7 allows fragments of I6 code
to be "included". Note that this is different from the ability to define
phrases using I6: what we're talking about here is the ability to add I6
material in Class or Object definitions, or simply in between other
declarations in the I6 output, but always outside of a routine.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">i6_inclusion_matter</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">material_to_include</span><span class="plain">; </span><span class="comment">normally an I6 escape <code class="display"><span class="extract">(- ... -)</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs_to_include_with</span><span class="plain">; </span><span class="comment">typically an object or class definition</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">i6_inclusion_matter</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure i6_inclusion_matter is private to this section.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Inclusions are primitive things, but fine control is needed over exactly
where they go.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">SEGMENT_LEVEL_INC</span><span class="plain"> </span><span class="constant">1</span><span class="plain"> </span><span class="comment">before, instead of, or after a segment of I6 template</span>
<span class="definitionkeyword">define</span> <span class="constant">SECTION_LEVEL_INC</span><span class="plain"> </span><span class="constant">2</span><span class="plain"> </span><span class="comment">before, instead of, or after a section of I6 template</span>
<span class="definitionkeyword">define</span> <span class="constant">WHEN_DEFINING_INC</span><span class="plain"> </span><span class="constant">3</span><span class="plain"> </span><span class="comment">as part of an Object or Class definition</span>
<span class="definitionkeyword">define</span> <span class="constant">AS_PREFORM_INC</span><span class="plain"> </span><span class="constant">4</span><span class="plain"> </span><span class="comment">include it not as I6, but as Preform grammar</span>
</pre>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Some variables used only in parsing inclusion instructions:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inclusion_side</span><span class="plain">, </span><span class="identifier">section_inclusion_wn</span><span class="plain">, </span><span class="identifier">segment_inclusion_wn</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Include sentences are a way to merge lower-level programming, from another
language, into Inform source text. They are intended only as a last resort,
though seasoned I6 hackers tend to reach for them a little sooner than that.
</p>
<p class="inwebparagraph">A sentence typically takes the form:
</p>
<blockquote>
<p>Include (- ... -) when defining a thing.</p>
</blockquote>
<p class="inwebparagraph">and the following grammar defines the "when defining a thing" end.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">inform6</span><span class="plain">-</span><span class="identifier">inclusion</span><span class="plain">-</span><span class="identifier">location</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">inclusion</span><span class="plain">-</span><span class="identifier">side</span><span class="plain">&gt; {&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} | ==&gt; </span>&lt;<span class="cwebmacro">Note segment-level inclusion</span> <span class="cwebmacronumber">5.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">inclusion</span><span class="plain">-</span><span class="identifier">side</span><span class="plain">&gt; {&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} </span><span class="identifier">in</span><span class="plain"> {&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">without</span><span class="plain">-</span><span class="identifier">subs</span><span class="plain">&gt;} | ==&gt; </span>&lt;<span class="cwebmacro">Note section-level inclusion</span> <span class="cwebmacronumber">5.2</span>&gt;
<span class="identifier">when</span><span class="plain"> </span><span class="identifier">defining</span><span class="plain"> &lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">type</span><span class="plain">-</span><span class="identifier">expression</span><span class="plain">&gt; | ==&gt; </span><span class="constant">WHEN_DEFINING_INC</span><span class="plain">; &lt;&lt;</span><span class="identifier">parse_node:s</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]</span>
<span class="identifier">when</span><span class="plain"> </span><span class="identifier">defining</span><span class="plain"> ... | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_WhenDefiningUnknown problem</span> <span class="cwebmacronumber">5.3</span>&gt;
<span class="identifier">before</span><span class="plain"> </span><span class="identifier">the</span><span class="plain"> </span><span class="identifier">library</span><span class="plain"> | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_BeforeTheLibrary problem</span> <span class="cwebmacronumber">5.4</span>&gt;
<span class="identifier">in</span><span class="plain"> </span><span class="identifier">the</span><span class="plain"> </span><span class="identifier">preform</span><span class="plain"> </span><span class="identifier">grammar</span><span class="plain"> ==&gt; </span><span class="constant">AS_PREFORM_INC</span>
<span class="plain">&lt;</span><span class="identifier">inclusion</span><span class="plain">-</span><span class="identifier">side</span><span class="plain">&gt; ::=</span>
<span class="identifier">before</span><span class="plain"> | ==&gt; </span><span class="identifier">BEFORE_LINK_STAGE</span>
<span class="identifier">instead</span><span class="plain"> </span><span class="identifier">of</span><span class="plain"> | ==&gt; </span><span class="identifier">INSTEAD_LINK_STAGE</span>
<span class="identifier">after</span><span class="plain"> ==&gt; </span><span class="identifier">AFTER_LINK_STAGE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Note segment-level inclusion</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">SEGMENT_LEVEL_INC</span><span class="plain">;</span>
<span class="identifier">inclusion_side</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="identifier">segment_inclusion_wn</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[2];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_2"></a><b>&#167;5.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Note section-level inclusion</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">SECTION_LEVEL_INC</span><span class="plain">;</span>
<span class="identifier">inclusion_side</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="identifier">section_inclusion_wn</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[2]; </span><span class="identifier">segment_inclusion_wn</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[3];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_3"></a><b>&#167;5.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_WhenDefiningUnknown problem</span> <span class="cwebmacronumber">5.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_WhenDefiningUnknown</span><span class="plain">),</span>
<span class="string">"I do not understand what definition you're referring to"</span><span class="plain">,</span>
<span class="string">"so I can't make an Inform 6 inclusion there."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_4"></a><b>&#167;5.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_BeforeTheLibrary problem</span> <span class="cwebmacronumber">5.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BeforeTheLibrary</span><span class="plain">),</span>
<span class="string">"this syntax was withdrawn in January 2008"</span><span class="plain">,</span>
<span class="string">"in favour of a more finely controlled I6 inclusion command. The effect "</span>
<span class="string">"you want can probably be achieved by writing 'after \"Definitions.i6t\".' "</span>
<span class="string">"instead of 'before the library.'"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Note that although Preform inclusions are syntactically like I6 inclusions,
and share the grammar above, they're nevertheless a different thing and aren't
handled here: if we see one, we ignore it.
</p>
<pre class="display">
<span class="reserved">sentence_handler</span><span class="plain"> </span><span class="identifier">INFORM6CODE_SH_handler</span><span class="plain"> =</span>
<span class="plain">{ </span><span class="identifier">INFORM6CODE_NT</span><span class="plain">, -1, </span><span class="constant">2</span><span class="plain">, </span><span class="functiontext">Config::Inclusions::inform_6_inclusion</span><span class="plain"> };</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Config::Inclusions::inform_6_inclusion</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</span><span class="plain">) {</span>
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">PN</span><span class="plain">;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">IW</span><span class="plain"> = </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">);</span>
<span class="comment">skip to the instructions</span>
<span class="identifier">IW</span><span class="plain"> = </span><span class="identifier">Wordings::trim_first_word</span><span class="plain">(</span><span class="identifier">Wordings::trim_first_word</span><span class="plain">(</span><span class="identifier">Wordings::trim_first_word</span><span class="plain">(</span><span class="identifier">IW</span><span class="plain">)));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">IW</span><span class="plain">)) </span>&lt;<span class="cwebmacro">There are no specific instructions about where it goes</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">problem</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">inform6</span><span class="plain">-</span><span class="identifier">inclusion</span><span class="plain">-</span><span class="identifier">location</span><span class="plain">&gt;(</span><span class="identifier">IW</span><span class="plain">)) {</span>
<span class="identifier">problem</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SEGMENT_LEVEL_INC:</span>
&lt;<span class="cwebmacro">It's positioned with respect to a template segment</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="character">; break;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SECTION_LEVEL_INC:</span>
&lt;<span class="cwebmacro">It's positioned with respect to a template section</span> <span class="cwebmacronumber">6.3</span>&gt;<span class="character">; break;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">WHEN_DEFINING_INC:</span>
&lt;<span class="cwebmacro">It's positioned in the middle of a class or object definition</span> <span class="cwebmacronumber">6.4</span>&gt;<span class="character">; break;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">AS_PREFORM_INC:</span><span class="plain"> </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem</span><span class="plain">) </span>&lt;<span class="cwebmacro">Issue problem message for bad inclusion instructions</span> <span class="cwebmacronumber">6.5</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Config::Inclusions::inform_6_inclusion appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>In the absence of any instructions, we emulate this:
</p>
<blockquote>
<p>Include ... before "I6 Inclusions" in "Output.i6t".</p>
</blockquote>
<p class="inwebparagraph">Note that the inclusion side 1 means "before": see the grammar above.
(Though "after" would probably have worked just as well.)
</p>
<p class="inwebparagraph">The actual output of I6 material is going to be done by the Template code,
and what we do here is simply to give it instructions to do so at the
appropriate time.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">There are no specific instructions about where it goes</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Config::Inclusions::new_intervention</span><span class="plain">(</span><span class="identifier">AFTER_LINK_STAGE</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Output.i6t"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"I6 Inclusions"</span><span class="plain">,</span>
<span class="identifier">Lexer::word_raw_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">)) + </span><span class="constant">2</span><span class="plain">), </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">It's positioned with respect to a template segment</span> <span class="cwebmacronumber">6.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">segment_inclusion_wn</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">, </span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">segment_inclusion_wn</span><span class="plain">));</span>
<span class="functiontext">Config::Inclusions::new_intervention</span><span class="plain">(</span><span class="identifier">inclusion_side</span><span class="plain">, </span><span class="identifier">seg</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="identifier">Lexer::word_raw_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">)) + </span><span class="constant">2</span><span class="plain">), </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_3"></a><b>&#167;6.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">It's positioned with respect to a template section</span> <span class="cwebmacronumber">6.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">section_inclusion_wn</span><span class="plain">);</span>
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">segment_inclusion_wn</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">sec</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">sec</span><span class="plain">, </span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">section_inclusion_wn</span><span class="plain">));</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">, </span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">segment_inclusion_wn</span><span class="plain">));</span>
<span class="functiontext">Config::Inclusions::new_intervention</span><span class="plain">(</span><span class="identifier">inclusion_side</span><span class="plain">, </span><span class="identifier">seg</span><span class="plain">, </span><span class="identifier">sec</span><span class="plain">,</span>
<span class="identifier">Lexer::word_raw_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">)) + </span><span class="constant">2</span><span class="plain">), </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">sec</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_4"></a><b>&#167;6.4. </b>When it comes to class and object definitions, we don't give the Template
code instructions; we remember what's needed ourselves:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">It's positioned in the middle of a class or object definition</span> <span class="cwebmacronumber">6.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = &lt;&lt;</span><span class="identifier">parse_node:s</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs</span><span class="plain"> = </span><span class="functiontext">InferenceSubjects::from_specification</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">infs</span><span class="plain">) {</span>
<span class="reserved">i6_inclusion_matter</span><span class="plain"> *</span><span class="identifier">inclm</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">i6_inclusion_matter</span><span class="plain">);</span>
<span class="identifier">inclm</span><span class="plain">-&gt;</span><span class="element">material_to_include</span><span class="plain"> = </span><span class="identifier">PN</span><span class="plain">;</span>
<span class="identifier">inclm</span><span class="plain">-&gt;</span><span class="element">infs_to_include_with</span><span class="plain"> = </span><span class="identifier">infs</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">problem</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_5"></a><b>&#167;6.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue problem message for bad inclusion instructions</span> <span class="cwebmacronumber">6.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadI6Inclusion</span><span class="plain">),</span>
<span class="string">"this is not a form of I6 code inclusion I recognise"</span><span class="plain">,</span>
<span class="string">"because the clause at the end telling me where to put the code "</span>
<span class="string">"excerpt is not one of the possibilities I know. The clause can "</span>
<span class="string">"either be blank (in which case I'll find somewhere sensible to "</span>
<span class="string">"put it), or 'when defining' plus the name of an object or kind "</span>
<span class="string">"of object, or 'before', 'instead of' or 'after' a double-quoted "</span>
<span class="string">"name of a template layer segment, or of a part of one. For "</span>
<span class="string">"instance, 'before \"Parser.i6t\".' or 'after \"Pronouns\" in "</span>
<span class="string">"\"Language.i6t\".'"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Config::Inclusions::new_intervention</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">segment</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">part</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">i6</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">seg</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i6</span><span class="plain">) {</span>
<span class="identifier">X</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="functiontext">I6T::interpret_i6t</span><span class="plain">(</span><span class="identifier">X</span><span class="plain">, </span><span class="identifier">i6</span><span class="plain">, -1);</span>
<span class="plain">}</span>
<span class="functiontext">Emit::intervention</span><span class="plain">(</span><span class="identifier">stage</span><span class="plain">, </span><span class="identifier">segment</span><span class="plain">, </span><span class="identifier">part</span><span class="plain">, </span><span class="identifier">X</span><span class="plain">, </span><span class="identifier">seg</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Config::Inclusions::new_intervention is used in <a href="#SP6_1">&#167;6.1</a>, <a href="#SP6_2">&#167;6.2</a>, <a href="#SP6_3">&#167;6.3</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>The following is our opportunity to redeem those inclusion-in-definitions
requests, which, again, we do by instructing the Template code.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Config::Inclusions::compile_inclusions_for_subject</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inference_subject</span><span class="plain"> *</span><span class="identifier">infs</span><span class="plain">) {</span>
<span class="reserved">i6_inclusion_matter</span><span class="plain"> *</span><span class="identifier">inclm</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain"> (</span><span class="identifier">inclm</span><span class="plain">, </span><span class="reserved">i6_inclusion_matter</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inclm</span><span class="plain">-&gt;</span><span class="identifier">infs_to_include_with</span><span class="plain"> == </span><span class="identifier">infs</span><span class="plain">) {</span>
<span class="functiontext">I6T::interpret_i6t</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">,</span>
<span class="identifier">Lexer::word_raw_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">inclm</span><span class="plain">-&gt;</span><span class="element">material_to_include</span><span class="plain">)) + </span><span class="constant">2</span><span class="plain">),</span>
<span class="plain">-1);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Config::Inclusions::compile_inclusions_for_subject is used in 15/epv (<a href="15-epv.html#SP1_1_2">&#167;1.1.2</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="26-fc.html">Back to 'Fundamental Constants'</a></li><li><a href="26-uo.html">Continue with 'Use Options'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>