1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/core-module/26-tti.html
2019-04-22 15:42:10 +01:00

245 lines
27 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>26/rt</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '26/tti' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#26">Chapter 26: Compilation Utilities</a></li><li><b>Translate to Identifiers</b></li></ul><p class="purpose">To provide a way to map high-level I7 constructs onto explicitly named identifiers in I6 code.</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>Translations can be made in a number of contexts:
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">INVALID_I6TR</span><span class="plain"> -1</span>
<span class="definitionkeyword">define</span> <span class="constant">PROPERTY_I6TR</span><span class="plain"> 0 </span> <span class="comment">"The open property translates into I6 as "open"."</span>
<span class="definitionkeyword">define</span> <span class="constant">NOUN_I6TR</span><span class="plain"> 1 </span> <span class="comment">"The north object translates into I6 as "n\_obj"."</span>
<span class="definitionkeyword">define</span> <span class="constant">RULE_I6TR</span><span class="plain"> 2 </span> <span class="comment">"The baffling rule translates into I6 as "BAFFLING\_R"."</span>
<span class="definitionkeyword">define</span> <span class="constant">VARIABLE_I6TR</span><span class="plain"> 3 </span> <span class="comment">"The sludge count variable translates into I6 as "sldgc".</span>
<span class="definitionkeyword">define</span> <span class="constant">ACTION_I6TR</span><span class="plain"> 4 </span> <span class="comment">"The taking action translates into I6 as "Take".</span>
<span class="definitionkeyword">define</span> <span class="constant">GRAMMAR_TOKEN_I6TR</span><span class="plain"> 5 </span> <span class="comment">"The grammar token "[whatever]" translates into I6 as "WHATEVER".</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>I7 provides the ability for the user to specify exactly what identifier name
to use as the I6 image of something, overriding the automatically composed
name above, in some cases. The following routine parses, tidies up and acts
on "... translates into I6 as ..." sentences; it gives their sentence
nodes an annotation marking what sort of thing is being translated.
</p>
<p class="inwebparagraph">This parses the subject of "... translates into I6 as ..." sentences,
such as "The yourself object" in
</p>
<blockquote>
<p>The yourself object translates into I6 as "selfobj".</p>
</blockquote>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">translates</span><span class="plain">-</span><span class="identifier">into</span><span class="plain">-</span><span class="identifier">i6</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt; ::=</span>
<span class="plain">... </span><span class="reserved">property</span><span class="plain"> | ==&gt; </span><span class="constant">PROPERTY_I6TR</span>
<span class="plain">... </span><span class="identifier">object</span><span class="plain">/</span><span class="identifier">kind</span><span class="plain"> | ==&gt; </span><span class="constant">NOUN_I6TR</span>
<span class="plain">{... </span><span class="reserved">rule</span><span class="plain">} | ==&gt; </span><span class="constant">RULE_I6TR</span>
<span class="plain">...</span><span class="element"> variable</span><span class="plain"> | ==&gt; </span><span class="constant">VARIABLE_I6TR</span>
<span class="plain">... </span><span class="identifier">action</span><span class="plain"> | ==&gt; </span><span class="constant">ACTION_I6TR</span>
<span class="identifier">understand</span><span class="plain"> </span><span class="identifier">token</span><span class="plain"> ... | ==&gt; </span><span class="constant">GRAMMAR_TOKEN_I6TR</span>
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_TranslatedUnknownCategory problem</span> <span class="cwebmacronumber">3.1</span>&gt;
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_TranslatedUnknownCategory problem</span> <span class="cwebmacronumber">3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">INVALID_I6TR</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TranslatedUnknownCategory</span><span class="plain">),</span>
<span class="string">"that isn't one of the things which can be translated to I6"</span><span class="plain">,</span>
<span class="string">"and should be '... variable', '... property', '... object', "</span>
<span class="string">"'... kind', '... rule', or '... action'. For instance, 'The yourself "</span>
<span class="string">"object translates into I6 as \</span><span class="plain">"</span><span class="string">selfobj\</span><span class="plain">"</span><span class="string">.'"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The object noun phrase is usually just an I6 identifier in quotation marks,
but it's also possible to list literal texts (for the benefit of rules).
Following the optional "with" is an articled list, each entry of which
will be required to pass <code class="display"><span class="extract">&lt;extra-response&gt;</span></code>.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">translates</span><span class="plain">-</span><span class="identifier">into</span><span class="plain">-</span><span class="identifier">i6</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">&gt; </span><span class="identifier">with</span><span class="plain"> &lt;</span><span class="identifier">nounphrase</span><span class="plain">-</span><span class="identifier">articled</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
<span class="plain">&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">IdentifierTranslations::as</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">parse_node</span><span class="plain"> *</span><span class="identifier">p1</span><span class="plain"> = </span><span class="identifier">pn</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">;</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p2</span><span class="plain"> = </span><span class="identifier">pn</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">;</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">responses_list</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">category</span><span class="plain"> = </span><span class="constant">INVALID_I6TR</span><span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">translates</span><span class="plain">-</span><span class="identifier">into</span><span class="plain">-</span><span class="identifier">i6</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p1</span><span class="plain">));</span>
<span class="identifier">category</span><span class="plain"> = &lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">category</span><span class="plain"> == </span><span class="constant">INVALID_I6TR</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">translates</span><span class="plain">-</span><span class="identifier">into</span><span class="plain">-</span><span class="identifier">i6</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;, 1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == 1) {</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">pn</span><span class="plain">, </span><span class="constant">category_of_I6_translation_ANNOT</span><span class="plain">, </span><span class="constant">INVALID_I6TR</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Ensure that we are translating to a quoted I6 identifier</span> <span class="cwebmacronumber">5.2</span>&gt;<span class="plain">;</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">pn</span><span class="plain">, </span><span class="constant">category_of_I6_translation_ANNOT</span><span class="plain">, </span><span class="identifier">category</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">responses_list</span><span class="plain">) </span><span class="identifier">ParseTree::graft</span><span class="plain">(</span><span class="identifier">responses_list</span><span class="plain">, </span><span class="identifier">p2</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">category</span><span class="plain"> = </span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">pn</span><span class="plain">, </span><span class="constant">category_of_I6_translation_ANNOT</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Take immediate action on the translation where possible</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function IdentifierTranslations::as is used in 7/ns (<a href="7-ns.html#SP18">&#167;18</a>).</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b>In some cases, we might as well act now; but in others we will act later,
traversing the parse tree to look for translation sentences of the right sort.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Take immediate action on the translation where possible</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">category</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PROPERTY_I6TR</span><span class="plain">:</span>
<span class="functiontext">Properties::translates</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">p2</span><span class="plain">);</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">pn</span><span class="plain">, </span><span class="constant">category_of_I6_translation_ANNOT</span><span class="plain">, </span><span class="constant">INVALID_I6TR</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NOUN_I6TR</span><span class="plain">: </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RULE_I6TR</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == 1) </span><span class="functiontext">Rules::Placement::declare_I6_written_rule</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">p2</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">traverse</span><span class="plain"> == 2) &amp;&amp; (</span><span class="identifier">p2</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">) &amp;&amp; (&lt;</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)))</span>
<span class="functiontext">IdentifierTranslations::plus_responses</span><span class="plain">(</span><span class="identifier">p2</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">, &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">VARIABLE_I6TR</span><span class="plain">: </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == 2) </span><span class="functiontext">NonlocalVariables::translates</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">p2</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ACTION_I6TR</span><span class="plain">: </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == 2) </span><span class="identifier">PL::Actions::translates</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">p2</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">GRAMMAR_TOKEN_I6TR</span><span class="plain">: </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">traverse</span><span class="plain"> == 2) </span><span class="identifier">PL::Parsing::Verbs::translates</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">p2</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</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_2"></a><b>&#167;5.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Ensure that we are translating to a quoted I6 identifier</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">valid</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">translates</span><span class="plain">-</span><span class="identifier">into</span><span class="plain">-</span><span class="identifier">i6</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p2</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">valid</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">responses_list</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">valid</span><span class="plain">) </span>&lt;<span class="cwebmacro">Dequote it and see if it's valid</span> <span class="cwebmacronumber">5.2.1</span>&gt;<span class="character">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">valid</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TranslatedToNonIdentifier</span><span class="plain">),</span>
<span class="string">"Inform 7 constructions can only translate into quoted I6 identifiers"</span><span class="plain">,</span>
<span class="string">"which must be strings of 1 to 31 characters drawn from 1, 2, ..., 9, "</span>
<span class="string">"a or A, b or B, ..., z or Z, or underscore '_', except that the "</span>
<span class="string">"first character is not allowed to be a digit."</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</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_2_1"></a><b>&#167;5.2.1. </b>If it turns out not to be, we simply set <code class="display"><span class="extract">valid</span></code> to false.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Dequote it and see if it's valid</span> <span class="cwebmacronumber">5.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">wn</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">p2</span><span class="plain">));</span>
<span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">p2</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">));</span>
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">valid</span><span class="plain">) </span><span class="identifier">valid</span><span class="plain"> = </span><span class="identifier">Identifiers::valid</span><span class="plain">(</span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">));</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5_2">&#167;5.2</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Extra responses look just as they would in running code.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">extra</span><span class="plain">-</span><span class="identifier">response</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">&gt; ( &lt;</span><span class="identifier">response</span><span class="plain">-</span><span class="identifier">letter</span><span class="plain">&gt; ) ==&gt; </span><span class="identifier">R</span><span class="plain">[2];</span>
</pre>
<p class="inwebparagraph"></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">IdentifierTranslations::plus_responses</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="reserved">rule</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == </span><span class="identifier">AND_NT</span><span class="plain">) {</span>
<span class="functiontext">IdentifierTranslations::plus_responses</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="functiontext">IdentifierTranslations::plus_responses</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">extra</span><span class="plain">-</span><span class="identifier">response</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">))) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">code</span><span class="plain"> = &lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">response_message</span><span class="plain"> *</span><span class="identifier">resp</span><span class="plain"> = </span><span class="functiontext">Strings::response_cue</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">,</span>
<span class="identifier">code</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">), </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">Rules::now_rule_defines_response</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">code</span><span class="plain">, </span><span class="identifier">resp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_I6ResponsesAwry</span><span class="plain">),</span>
<span class="string">"additional information about I6 translation of a rule can "</span>
<span class="string">"only take the form of a list of responses"</span><span class="plain">,</span>
<span class="string">"each quoted and followed by a bracketed letter."</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function IdentifierTranslations::plus_responses is used in <a href="#SP5_1">&#167;5.1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="26-rt.html">Back to 'Routines'</a></li><li><a href="26-iti.html">Continue with 'I6 Template Interpreter'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>