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/24-lv.html
2020-04-15 23:49:59 +01:00

1555 lines
237 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Local Variables</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="../index.html">
<img src="../docs-src/Figures/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="../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="../problems-module/index.html">problems</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>Shared Modules</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="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Local Variables' generated by 7-->
<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#24">Chapter 24: Compilation Context</a></li><li><b>Local Variables</b></li></ul><p class="purpose">Local variables are used for call parameters, temporary values, and other ephemeral workspace.</p>
<ul class="toc"><li><a href="24-lv.html#SP1">&#167;1. Definitions</a></li><li><a href="24-lv.html#SP6">&#167;6. Boxing</a></li><li><a href="24-lv.html#SP7">&#167;7. Adding</a></li><li><a href="24-lv.html#SP15">&#167;15. Deallocating</a></li><li><a href="24-lv.html#SP17">&#167;17. Extent</a></li><li><a href="24-lv.html#SP18">&#167;18. Copying</a></li><li><a href="24-lv.html#SP19">&#167;19. Searching</a></li><li><a href="24-lv.html#SP26">&#167;26. It</a></li><li><a href="24-lv.html#SP28">&#167;28. Local Parking</a></li><li><a href="24-lv.html#SP30">&#167;30. Equation terms</a></li><li><a href="24-lv.html#SP31">&#167;31. Callings</a></li><li><a href="24-lv.html#SP34">&#167;34. Permissible names</a></li><li><a href="24-lv.html#SP35">&#167;35. Logging</a></li><li><a href="24-lv.html#SP37">&#167;37. Kind</a></li><li><a href="24-lv.html#SP39">&#167;39. Protection</a></li><li><a href="24-lv.html#SP40">&#167;40. Block scope</a></li><li><a href="24-lv.html#SP43">&#167;43. Callings</a></li><li><a href="24-lv.html#SP44">&#167;44. Writer</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>Each phrase has its own "slate" of local variables. For example, in
the definition "..." of:
</p>
<blockquote>
<p>To attract (ferrous item - a thing) with (magnet - a thing), uninsulated: ...</p>
</blockquote>
<p class="inwebparagraph">two locals are "ferrous item" and "magnet", of type <code class="display"><span class="extract">TOKEN_CALL_PARAMETER_LV</span></code>.
The presence of ", uninsulated" means that another local is "phrase options",
of type <code class="display"><span class="extract">OTHER_CALL_PARAMETER_LV</span></code>, because the bitmap of options chosen is
passed as an additional call parameter when the phrase is invoked.
</p>
<p class="inwebparagraph">Within the definition, we might have:
</p>
<blockquote>
<p>let Q be the electrical charge;</p>
</blockquote>
<blockquote>
<p>repeat with the item running through things: say "The needle flickers over [the item]."</p>
</blockquote>
<p class="inwebparagraph">Here "Q" and "item" are both <code class="display"><span class="extract">LET_VALUE_LV</span></code> variables, but whereas "Q" exists
all through the phrase, "item" exists only inside its own repeat loop: this
is called its block scope. When Inform compiles on past the end of the loop,
it doesn't actually delete the local variable structure for "item": it simply
marks it as deallocated.
</p>
<p class="inwebparagraph">A slate of locals is stored like so:
</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">locals_slate</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">local_variable_allocation</span><span class="plain">; </span><span class="comment"> linked list of valid locals</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">it_variable_exists</span><span class="plain">; </span><span class="comment"> it, he, she, or they, used for adjective definitions</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">its_form_allowed</span><span class="plain">; </span><span class="comment"> its, his, her or their, ditto</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">it_pseudonym</span><span class="plain">; </span><span class="comment"> a further variation on the same variable</span>
<span class="plain">} </span><span class="reserved">locals_slate</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure locals_slate is accessed in 24/sf and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Which contains a linked list of variables of the following types:
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">TOKEN_CALL_PARAMETER_LV</span><span class="plain"> </span><span class="constant">1</span><span class="plain"> </span><span class="comment"> values for the tokens of the phrase being invoked</span>
<span class="definitionkeyword">define</span> <span class="constant">OTHER_CALL_PARAMETER_LV</span><span class="plain"> </span><span class="constant">2</span><span class="plain"> </span><span class="comment"> other implied parameters passed during invocation: I6-level only</span>
<span class="definitionkeyword">define</span> <span class="constant">LET_VALUE_LV</span><span class="plain"> </span><span class="constant">3</span><span class="plain"> </span><span class="comment"> variables created by "let", "while" or "repeat"</span>
<span class="definitionkeyword">define</span> <span class="constant">INTERNAL_USE_LV</span><span class="plain"> </span><span class="constant">4</span><span class="plain"> </span><span class="comment"> workspace needed by our compiled code: I6-level only</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">local_variable</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lv_purpose</span><span class="plain">; </span><span class="comment"> one of the <code class="display"><span class="extract">*_LV</span></code> values above</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">lv_lvalue</span><span class="plain">; </span><span class="comment"> an Inform lvalue for the variable's run-time storage</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">index_with_this_purpose</span><span class="plain">; </span><span class="comment"> what index count it has, within locals of its type</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">comment_on_use</span><span class="plain">; </span><span class="comment"> purely to make the output more legible</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allocated</span><span class="plain">; </span><span class="comment"> in existence at this point in the routine?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">duplicated</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">varname</span><span class="plain">; </span><span class="comment"> name of local variable</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">name_hash</span><span class="plain">; </span><span class="comment"> hash code for this name</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">block_scope</span><span class="plain">; </span><span class="comment"> scope of a local - block depth</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">free_at_end_of_scope</span><span class="plain">; </span><span class="comment"> whether it holds temporary data on heap</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">kind_as_declared</span><span class="plain">; </span><span class="comment"> data type for the contents</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">protected</span><span class="plain">; </span><span class="comment"> from alteration using "let"?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">parsed_recently</span><span class="plain">; </span><span class="comment"> name recognised since this was last wiped?</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">; </span><span class="comment"> on the same slate</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">local_variable</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure local_variable is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ns, 7/oaf, 7/rs, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>A local variable needs to be stored somewhere at run-time. The obvious
correspondence is to put these into I6 local variables, which are, in effect,
CPU registers. We won't need to do much in the way of register-allocation,
though; we simply take the opportunity to reuse I6 locals if it presents
itself. The resulting I6 function tends to look like this example:
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">[ R_314 t_0 t_1 phrase_options tmp_0 tmp_1 tmp_2 ct_0 ct_1;</span></code>
</p>
<p class="inwebparagraph">where there are two tokens passed to the routine (<code class="display"><span class="extract">t_0</span></code> and <code class="display"><span class="extract">t_1</span></code>), and
there are phrase options (whose bitmap is in <code class="display"><span class="extract">phrase_options</span></code>), and at
the busiest point in the routine three temporary values are needed at
once (<code class="display"><span class="extract">tmp_0</span></code> and so on), and finally table-row selection will be
going on, so that we need to record a choice of table (<code class="display"><span class="extract">ct_0</span></code>) and
row number within that table (<code class="display"><span class="extract">ct_1</span></code>). A typical invocation of this
example phrase would compile to I6 like so:
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">R_314(20, O31_black_marble_slab, 16);</span></code>
</p>
<p class="inwebparagraph">It is perhaps worth stopping to ask ourselves why it is helpful for
values to be in local variables. Unlike traditional register allocation,
this is not done for any speed gain &mdash; in the Z-machine, there is no
particular advantage to a local vs a global variable. The actual reason
is to place a value in the stack frame for the current routine. For
instance, each phrase must have its own "currently selected table row":
it would not do for one phrase which uses another one to find that the
table row had been deselected as a side-effect. So <code class="display"><span class="extract">ct_0</span></code> and <code class="display"><span class="extract">ct_1</span></code>
are most conveniently stored as locals, not globals.
</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Tabula rasa:
</p>
<pre class="display">
<span class="reserved">locals_slate</span><span class="plain"> </span><span class="functiontext">LocalVariables::blank_slate<button class="popup" onclick="togglePopup('usagePopup1847')">...<span class="popuptext" id="usagePopup1847">Usage of <b>LocalVariables::blank_slate</b>:<br>Stack Frames - <a href="24-sf.html#SP5">&#167;5</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">locals_slate</span><span class="plain"> </span><span class="identifier">slate</span><span class="plain">;</span>
<span class="identifier">slate</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">slate</span><span class="plain">.</span><span class="element">it_pseudonym</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">slate</span><span class="plain">.</span><span class="element">it_variable_exists</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">slate</span><span class="plain">.</span><span class="element">its_form_allowed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">slate</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Boxing. </b>It's sometimes necessary to "box" a stack frame &mdash; to store the entire current
context of compilation for later use. That includes locals, so:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::deep_copy_locals_slate<button class="popup" onclick="togglePopup('usagePopup1848')">...<span class="popuptext" id="usagePopup1848">Usage of <b>LocalVariables::deep_copy_locals_slate</b>:<br>Stack Frames - <a href="24-sf.html#SP7">&#167;7</a></span></button></span><span class="plain">(</span><span class="reserved">locals_slate</span><span class="plain"> *</span><span class="identifier">slate_to</span><span class="plain">, </span><span class="reserved">locals_slate</span><span class="plain"> *</span><span class="identifier">slate_from</span><span class="plain">) {</span>
<span class="plain">*</span><span class="identifier">slate_to</span><span class="plain"> = *</span><span class="identifier">slate_from</span><span class="plain">;</span>
<span class="identifier">slate_to</span><span class="plain">-&gt;</span><span class="identifier">local_variable_allocation</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">, *</span><span class="identifier">tail</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">slate_from</span><span class="plain">-&gt;</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">=</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">dup</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain">); *</span><span class="identifier">dup</span><span class="plain"> = *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="identifier">dup</span><span class="plain">-&gt;</span><span class="element">duplicated</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">dup</span><span class="plain">-&gt;</span><span class="element">next</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">tail</span><span class="plain">) </span><span class="identifier">tail</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain"> = </span><span class="identifier">dup</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">slate_to</span><span class="plain">-&gt;</span><span class="element">local_variable_allocation</span><span class="plain"> = </span><span class="identifier">dup</span><span class="plain">;</span>
<span class="identifier">tail</span><span class="plain"> = </span><span class="identifier">dup</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Adding. </b></p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_to_locals_slate<button class="popup" onclick="togglePopup('usagePopup1849')">...<span class="popuptext" id="usagePopup1849">Usage of <b>LocalVariables::add_to_locals_slate</b>:<br><a href="24-lv.html#SP8">&#167;8</a>, <a href="24-lv.html#SP10">&#167;10</a>, <a href="24-lv.html#SP11">&#167;11</a>, <a href="24-lv.html#SP18">&#167;18</a>, <a href="24-lv.html#SP26">&#167;26</a></span></button></span><span class="plain">(</span><span class="reserved">locals_slate</span><span class="plain"> *</span><span class="identifier">slate</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">purpose</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">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">override_lvalue</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">override_index</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ix</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment"> the new one will be the 0th, 1st, 2nd, ... with the same purpose</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</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">slate</span><span class="plain">) </span>&lt;<span class="cwebmacro">Make use of an unallocated var if possible, but otherwise add a new one</span> <span class="cwebmacronumber">7.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Make a new local variable structure</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">override_index</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">ix</span><span class="plain"> = </span><span class="identifier">override_index</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Fill in the local variable structure, whether it's new or recycled</span> <span class="cwebmacronumber">7.3</span>&gt;<span class="character">;</span>
<span class="functiontext"><a href="10-aots.html#SP14">ExParser::warn_expression_cache</a></span><span class="plain">(); </span><span class="comment"> the range of parsing possibilities has changed</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make use of an unallocated var if possible, but otherwise add a new one</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">find</span><span class="plain"> = </span><span class="identifier">slate</span><span class="plain">-&gt;</span><span class="element">local_variable_allocation</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">find</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Make a new local variable structure</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
<span class="identifier">slate</span><span class="plain">-&gt;</span><span class="element">local_variable_allocation</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">find</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">find</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="identifier">purpose</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">find</span><span class="plain">-&gt;</span><span class="identifier">allocated</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) { </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">find</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
<span class="identifier">ix</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">find</span><span class="plain">-&gt;</span><span class="identifier">next</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Make a new local variable structure</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
<span class="identifier">find</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">find</span><span class="plain"> = </span><span class="identifier">find</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="24-lv.html#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make a new local variable structure</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain">);</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">duplicated</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="24-lv.html#SP7">&#167;7</a>, <a href="24-lv.html#SP7_1">&#167;7.1</a> (twice).</p>
<p class="inwebparagraph"><a id="SP7_3"></a><b>&#167;7.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Fill in the local variable structure, whether it's new or recycled</span> <span class="cwebmacronumber">7.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_purpose</span><span class="plain"> = </span><span class="identifier">purpose</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">allocated</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">override_lvalue</span><span class="plain">) </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">override_lvalue</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">prefix</span><span class="plain"> = </span><span class="string">"unknown"</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">purpose</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TOKEN_CALL_PARAMETER_LV:</span><span class="plain"> </span><span class="identifier">prefix</span><span class="plain"> = </span><span class="string">"t"</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="identifier">OTHER_CALL_PARAMETER_LV:</span><span class="plain"> </span><span class="identifier">prefix</span><span class="plain"> = </span><span class="string">"ti"</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="identifier">LET_VALUE_LV:</span><span class="plain"> </span><span class="identifier">prefix</span><span class="plain"> = </span><span class="string">"tmp"</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="identifier">INTERNAL_USE_LV:</span><span class="plain"> </span><span class="identifier">prefix</span><span class="plain"> = </span><span class="string">"misc"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown local variable purpose"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">, </span><span class="string">"%s_%d"</span><span class="plain">, </span><span class="identifier">prefix</span><span class="plain">, </span><span class="identifier">ix</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">index_with_this_purpose</span><span class="plain"> = </span><span class="identifier">ix</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">block_scope</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment"> by default: universal scope throughout routine</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">free_at_end_of_scope</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">kind_as_declared</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">protected</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">parsed_recently</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">comment_on_use</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">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">unsuitable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="reserved">for</span><span class="plain">-</span><span class="identifier">locals</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Throw a problem for an unsuitable name</span> <span class="cwebmacronumber">7.3.1</span>&gt;<span class="plain">;</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Articles::remove_the</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">name_hash</span><span class="plain"> = </span><span class="identifier">ExcerptMeanings::hash_code</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="24-lv.html#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_1"></a><b>&#167;7.3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Throw a problem for an unsuitable name</span> <span class="cwebmacronumber">7.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CalledThe</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"In %1, you seem to be giving a temporary value a pretty "</span>
<span class="string">"odd name - '%2', which I won't allow because it would lead to too "</span>
<span class="string">"many ambiguities."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="24-lv.html#SP7_3">&#167;7.3</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>For example, here are the call parameters. If there are three of these,
they compile to the I6 names <code class="display"><span class="extract">t_0</span></code>, <code class="display"><span class="extract">t_1</span></code> and <code class="display"><span class="extract">t_2</span></code>.
</p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_call_parameter<button class="popup" onclick="togglePopup('usagePopup1850')">...<span class="popuptext" id="usagePopup1850">Usage of <b>LocalVariables::add_call_parameter</b>:<br><a href="24-lv.html#SP27">&#167;27</a>, Measurement Adjectives - <a href="15-ma.html#SP13">&#167;13</a><br>Phrase Type Data - <a href="22-ptd.html#SP20">&#167;20</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</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">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP7">LocalVariables::add_to_locals_slate</a></span><span class="plain">(&amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">),</span>
<span class="constant">TOKEN_CALL_PARAMETER_LV</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, -1);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">LOCAL_VARIABLES</span><span class="plain">, </span><span class="string">"Call parameter $k added\n"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_call_parameter_as_symbol<button class="popup" onclick="togglePopup('usagePopup1851')">...<span class="popuptext" id="usagePopup1851">Usage of <b>LocalVariables::add_call_parameter_as_symbol</b>:<br>Binary Predicates - <a href="6-bp.html#SP25">&#167;25</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</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">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP8">LocalVariables::add_call_parameter</a></span><span class="plain">(</span><span class="identifier">phsf</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">8</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Inversely:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LocalVariables::get_parameter_number<button class="popup" onclick="togglePopup('usagePopup1852')">...<span class="popuptext" id="usagePopup1852">Usage of <b>LocalVariables::get_parameter_number</b>:<br>Compile Invocations Inline - <a href="25-cii.html#SP3_1">&#167;3.1</a>, <a href="25-cii.html#SP6">&#167;6</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lvar</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_purpose</span><span class="plain"> != </span><span class="constant">TOKEN_CALL_PARAMETER_LV</span><span class="plain">))</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"not a call parameter"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">index_with_this_purpose</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>And here are the "let" values, which can only be added to the routine
currently being compiled:
</p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::new<button class="popup" onclick="togglePopup('usagePopup1853')">...<span class="popuptext" id="usagePopup1853">Usage of <b>LocalVariables::new</b>:<br><a href="24-lv.html#SP33_3">&#167;33.3</a>, Deciding to Defer - <a href="12-dtd.html#SP23">&#167;23</a>, <a href="12-dtd.html#SP27">&#167;27</a><br>Compile Invocations Inline - <a href="25-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="25-cii.html#SP3_5_1_1">&#167;3.5.1.1</a></span></button></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">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to add let value without stack frame"</span><span class="plain">);</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP7">LocalVariables::add_to_locals_slate</a></span><span class="plain">(&amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">),</span>
<span class="constant">LET_VALUE_LV</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, -1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Produce::emitting_routine</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">()))</span>
<span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">6</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">LOCAL_VARIABLES</span><span class="plain">, </span><span class="string">"Let value $k allocated\n"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>Calling this guarantees the presence, at run-time, of an I6 local variable
with a given name. It won't be connected with any I7 values; it will just be
scratch work-space which can be used in the compiled code.
</p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_internal<button class="popup" onclick="togglePopup('usagePopup1854')">...<span class="popuptext" id="usagePopup1854">Usage of <b>LocalVariables::add_internal</b>:<br><a href="24-lv.html#SP14">&#167;14</a></span></button></span><span class="plain">(</span><span class="reserved">locals_slate</span><span class="plain"> *</span><span class="identifier">slate</span><span class="plain">,</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">purpose</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP19">LocalVariables::find_i6_var</a></span><span class="plain">(</span><span class="identifier">slate</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">purpose</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP7">LocalVariables::add_to_locals_slate</a></span><span class="plain">(</span><span class="identifier">slate</span><span class="plain">, </span><span class="identifier">purpose</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, -1);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_internal_local<button class="popup" onclick="togglePopup('usagePopup1855')">...<span class="popuptext" id="usagePopup1855">Usage of <b>LocalVariables::add_internal_local</b>:<br>Compile Invocations Inline - <a href="25-cii.html#SP3_5_1_2">&#167;3.5.1.2</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_internal</a></span><span class="plain">(&amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">), </span><span class="identifier">name</span><span class="plain">,</span>
<span class="constant">INTERNAL_USE_LV</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_internal_local_as_symbol<button class="popup" onclick="togglePopup('usagePopup1856')">...<span class="popuptext" id="usagePopup1856">Usage of <b>LocalVariables::add_internal_local_as_symbol</b>:<br>Adjective Meanings - <a href="4-am.html#SP42">&#167;42</a><br>Literal Patterns - <a href="5-lp.html#SP27">&#167;27</a><br>Compile Deferred Propositions - <a href="12-cdp.html#SP2_1_5">&#167;2.1.5</a>, <a href="12-cdp.html#SP2_1_5_1">&#167;2.1.5.1</a><br>Responses - <a href="17-rs.html#SP6_2">&#167;6.2</a><br>Chronology - <a href="24-ch.html#SP7">&#167;7</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_internal_local</a></span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">8</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_internal_local_as_symbol_noting<button class="popup" onclick="togglePopup('usagePopup1857')">...<span class="popuptext" id="usagePopup1857">Usage of <b>LocalVariables::add_internal_local_as_symbol_noting</b>:<br>Compile Deferred Propositions - <a href="12-cdp.html#SP2_1_5">&#167;2.1.5</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">local_variable</span><span class="plain"> **</span><span class="identifier">lv</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_internal_local</a></span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lv</span><span class="plain">) *</span><span class="identifier">lv</span><span class="plain"> = </span><span class="identifier">v</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">8</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_named_call<button class="popup" onclick="togglePopup('usagePopup1858')">...<span class="popuptext" id="usagePopup1858">Usage of <b>LocalVariables::add_named_call</b>:<br><a href="24-lv.html#SP47">&#167;47</a>, Runtime Support for Kinds - <a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a><br>Rule Bookings - <a href="21-rb.html#SP23">&#167;23</a><br>Phrases as Values - <a href="22-pav.html#SP9_2">&#167;9.2</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_internal</a></span><span class="plain">(&amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">), </span><span class="identifier">name</span><span class="plain">,</span>
<span class="constant">OTHER_CALL_PARAMETER_LV</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_named_call_as_symbol<button class="popup" onclick="togglePopup('usagePopup1859')">...<span class="popuptext" id="usagePopup1859">Usage of <b>LocalVariables::add_named_call_as_symbol</b>:<br>Adjective Meanings - <a href="4-am.html#SP42">&#167;42</a><br>Literal Patterns - <a href="5-lp.html#SP27">&#167;27</a><br>Relations - <a href="6-rlt.html#SP15_2">&#167;15.2</a>, <a href="6-rlt.html#SP17">&#167;17</a>, <a href="6-rlt.html#SP29_1">&#167;29.1</a><br>New Verbs - <a href="6-nv.html#SP18_1">&#167;18.1</a>, <a href="6-nv.html#SP18_2">&#167;18.2</a><br>Extension Files - <a href="8-ef.html#SP9">&#167;9</a><br>Cinders and Deferrals - <a href="12-cad.html#SP5">&#167;5</a><br>Compile Deferred Propositions - <a href="12-cdp.html#SP2_1_5">&#167;2.1.5</a>, <a href="12-cdp.html#SP2_1_5_2">&#167;2.1.5.2</a><br>Runtime Support for Kinds - <a href="13-rsfk.html#SP16_3">&#167;16.3</a>, <a href="13-rsfk.html#SP24_1">&#167;24.1</a>, <a href="13-rsfk.html#SP24_2">&#167;24.2</a>, <a href="13-rsfk.html#SP24_3">&#167;24.3</a>, <a href="13-rsfk.html#SP24_5">&#167;24.5</a>, <a href="13-rsfk.html#SP24_6_1">&#167;24.6.1</a>, <a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_5">&#167;24.6.5</a>, <a href="13-rsfk.html#SP24_6_6">&#167;24.6.6</a>, <a href="13-rsfk.html#SP25">&#167;25</a><br>Responses - <a href="17-rs.html#SP6_2">&#167;6.2</a>, <a href="17-rs.html#SP7_2">&#167;7.2</a><br>Table Columns - <a href="19-tc.html#SP8">&#167;8</a><br>Runtime Support for Tables - <a href="19-rsft.html#SP2">&#167;2</a><br>Rules - <a href="21-rl.html#SP20">&#167;20</a><br>Rule Bookings - <a href="21-rb.html#SP24_1_1">&#167;24.1.1</a><br>Rulebooks - <a href="21-rl2.html#SP14_1">&#167;14.1</a><br>Focus and Outcome - <a href="21-fao.html#SP10">&#167;10</a><br>Stacked Variables - <a href="21-sv.html#SP3">&#167;3</a><br>Chronology - <a href="24-ch.html#SP7">&#167;7</a><br>Use Options - <a href="26-uo.html#SP21_1">&#167;21.1</a>, <a href="26-uo.html#SP21_2">&#167;21.2</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_named_call</a></span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">8</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_named_call_as_symbol_noting<button class="popup" onclick="togglePopup('usagePopup1860')">...<span class="popuptext" id="usagePopup1860">Usage of <b>LocalVariables::add_named_call_as_symbol_noting</b>:<br>Relations - <a href="6-rlt.html#SP15_2">&#167;15.2</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">local_variable</span><span class="plain"> **</span><span class="identifier">lv</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_named_call</a></span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lv</span><span class="plain">) *</span><span class="identifier">lv</span><span class="plain"> = </span><span class="identifier">v</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">8</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_internal_local_c<button class="popup" onclick="togglePopup('usagePopup1861')">...<span class="popuptext" id="usagePopup1861">Usage of <b>LocalVariables::add_internal_local_c</b>:<br><a href="24-lv.html#SP12">&#167;12</a>, <a href="24-lv.html#SP13">&#167;13</a>, Runtime Support for Kinds - <a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">&#167;24.6.4</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">comment</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> =</span>
<span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_internal</a></span><span class="plain">(&amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">),</span>
<span class="identifier">name</span><span class="plain">, </span><span class="constant">INTERNAL_USE_LV</span><span class="plain">);</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">comment_on_use</span><span class="plain"> = </span><span class="identifier">comment</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_internal_local_c_as_symbol<button class="popup" onclick="togglePopup('usagePopup1862')">...<span class="popuptext" id="usagePopup1862">Usage of <b>LocalVariables::add_internal_local_c_as_symbol</b>:<br>Relations - <a href="6-rlt.html#SP15">&#167;15</a><br>Rule Bookings - <a href="21-rb.html#SP24_1_1">&#167;24.1.1</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">comment</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_internal_local_c</a></span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">comment</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">8</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_internal_local_c_as_symbol_noting<button class="popup" onclick="togglePopup('usagePopup1863')">...<span class="popuptext" id="usagePopup1863">Usage of <b>LocalVariables::add_internal_local_c_as_symbol_noting</b>:<br>Relations - <a href="6-rlt.html#SP15_2">&#167;15.2</a>, <a href="6-rlt.html#SP29_2">&#167;29.2</a>, <a href="6-rlt.html#SP29_3">&#167;29.3</a>, <a href="6-rlt.html#SP29_4">&#167;29.4</a>, <a href="6-rlt.html#SP29_5">&#167;29.5</a>, <a href="6-rlt.html#SP29_6">&#167;29.6</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">comment</span><span class="plain">, </span><span class="reserved">local_variable</span><span class="plain"> **</span><span class="identifier">lv</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_internal_local_c</a></span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">comment</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lv</span><span class="plain">) *</span><span class="identifier">lv</span><span class="plain"> = </span><span class="identifier">v</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">8</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>For example, <code class="display"><span class="extract">ct_0</span></code> and <code class="display"><span class="extract">ct_1</span></code> contain the current table and row selection,
in phrases for which that's relevant.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::add_table_lookup<button class="popup" onclick="togglePopup('usagePopup1864')">...<span class="popuptext" id="usagePopup1864">Usage of <b>LocalVariables::add_table_lookup</b>:<br>Simplifications - <a href="11-sm.html#SP4">&#167;4</a><br>Lvalues - <a href="14-lv.html#SP14_5">&#167;14.5</a><br>Listed-In Relations - <a href="19-lr.html#SP7">&#167;7</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_internal_local_c</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"ct_0"</span><span class="plain">, </span><span class="string">"currently selected table"</span><span class="plain">);</span>
<span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_internal_local_c</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"ct_1"</span><span class="plain">, </span><span class="string">"currently selected row"</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">LOCAL_VARIABLES</span><span class="plain">, </span><span class="string">"Stack frame acquires CT locals\n"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>Similarly <code class="display"><span class="extract">sw_v</span></code> holds a temporary switch value, in some cases.
</p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_switch_value<button class="popup" onclick="togglePopup('usagePopup1865')">...<span class="popuptext" id="usagePopup1865">Usage of <b>LocalVariables::add_switch_value</b>:<br>Compile Phrases - <a href="25-cp.html#SP5_3_5">&#167;5.3.5</a></span></button></span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">LOCAL_VARIABLES</span><span class="plain">, </span><span class="string">"Stack frame acquires switch value\n"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_internal_local_c</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"sw_v"</span><span class="plain">, </span><span class="string">"switch value"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>Finally, when phrase options are used in invoking a phrase, a bitmap is
passed to its I6 routine, and this occupies a pseudo-call-parameter:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::options_parameter_is_needed<button class="popup" onclick="togglePopup('usagePopup1866')">...<span class="popuptext" id="usagePopup1866">Usage of <b>LocalVariables::options_parameter_is_needed</b>:<br>Phrases - <a href="22-ph.html#SP6_5">&#167;6.5</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_internal</a></span><span class="plain">(&amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">),</span>
<span class="identifier">I</span><span class="string">"phrase_options"</span><span class="plain">, </span><span class="constant">OTHER_CALL_PARAMETER_LV</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Deallocating. </b>The following is used when a "let" variable falls out of scope: for instance,
a loop counter disappearing when its loop body is finished.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::deallocate<button class="popup" onclick="togglePopup('usagePopup1867')">...<span class="popuptext" id="usagePopup1867">Usage of <b>LocalVariables::deallocate</b>:<br><a href="24-lv.html#SP16">&#167;16</a>, <a href="24-lv.html#SP41">&#167;41</a>, Compile Invocations Inline - <a href="25-cii.html#SP1_5">&#167;1.5</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> != </span><span class="constant">LET_VALUE_LV</span><span class="plain">)</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"only let variables can be deallocated"</span><span class="plain">);</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">allocated</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">name_hash</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">block_scope</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">free_at_end_of_scope</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>More extremely:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::deallocate_all<button class="popup" onclick="togglePopup('usagePopup1868')">...<span class="popuptext" id="usagePopup1868">Usage of <b>LocalVariables::deallocate_all</b>:<br>Compile Phrases - <a href="25-cp.html#SP3_2">&#167;3.2</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="constant">LET_VALUE_LV</span><span class="plain">) &amp;&amp; (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">allocated</span><span class="plain">))</span>
<span class="functiontext"><a href="24-lv.html#SP15">LocalVariables::deallocate</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. Extent. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LocalVariables::count<button class="popup" onclick="togglePopup('usagePopup1869')">...<span class="popuptext" id="usagePopup1869">Usage of <b>LocalVariables::count</b>:<br>Text Substitutions - <a href="17-ts.html#SP5">&#167;5</a><br>Routines - <a href="26-rt.html#SP4">&#167;4</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ct</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="identifier">ct</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ct</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. Copying. </b>It turns out to be useful to be able to copy one slate's variables to
another, in order to remember the current variable names to make sense
of a text substitution later.
</p>
<p class="inwebparagraph">We have to deep-copy the variables, not simply copy the head of the linked
list, because they may include variables which will be deallocated and then
given fresh names in between now and then.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::copy<button class="popup" onclick="togglePopup('usagePopup1870')">...<span class="popuptext" id="usagePopup1870">Usage of <b>LocalVariables::copy</b>:<br>Text Substitutions - <a href="17-ts.html#SP5">&#167;5</a>, <a href="17-ts.html#SP11">&#167;11</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf_to</span><span class="plain">, </span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf_from</span><span class="plain">) {</span>
<span class="reserved">locals_slate</span><span class="plain"> *</span><span class="identifier">slate_from</span><span class="plain"> = &amp;(</span><span class="identifier">phsf_from</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">);</span>
<span class="reserved">locals_slate</span><span class="plain"> *</span><span class="identifier">slate_to</span><span class="plain"> = &amp;(</span><span class="identifier">phsf_to</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">);</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">slate_from</span><span class="plain">-&gt;</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">copied</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP7">LocalVariables::add_to_locals_slate</a></span><span class="plain">(</span><span class="identifier">slate_to</span><span class="plain">,</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_purpose</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">kind_as_declared</span><span class="plain">,</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">index_with_this_purpose</span><span class="plain">);</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">copied</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">slate_to</span><span class="plain">-&gt;</span><span class="identifier">it_variable_exists</span><span class="plain"> = </span><span class="identifier">slate_from</span><span class="plain">-&gt;</span><span class="element">it_variable_exists</span><span class="plain">;</span>
<span class="identifier">slate_to</span><span class="plain">-&gt;</span><span class="identifier">its_form_allowed</span><span class="plain"> = </span><span class="identifier">slate_from</span><span class="plain">-&gt;</span><span class="element">its_form_allowed</span><span class="plain">;</span>
<span class="identifier">slate_to</span><span class="plain">-&gt;</span><span class="identifier">it_pseudonym</span><span class="plain"> = </span><span class="identifier">slate_from</span><span class="plain">-&gt;</span><span class="element">it_pseudonym</span><span class="plain">;</span>
<span class="identifier">phsf_to</span><span class="plain">-&gt;</span><span class="element">local_stvol</span><span class="plain"> = </span><span class="identifier">phsf_from</span><span class="plain">-&gt;</span><span class="element">local_stvol</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. Searching. </b>One way is to search the slate for a scratch variable by its I6 name:
</p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::find_i6_var<button class="popup" onclick="togglePopup('usagePopup1871')">...<span class="popuptext" id="usagePopup1871">Usage of <b>LocalVariables::find_i6_var</b>:<br><a href="24-lv.html#SP11">&#167;11</a>, <a href="24-lv.html#SP20">&#167;20</a>, <a href="24-lv.html#SP22">&#167;22</a></span></button></span><span class="plain">(</span><span class="reserved">locals_slate</span><span class="plain"> *</span><span class="identifier">slate</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">purpose</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">slate</span><span class="plain">-&gt;</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="identifier">purpose</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">)))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::find_any<button class="popup" onclick="togglePopup('usagePopup1872')">...<span class="popuptext" id="usagePopup1872">Usage of <b>LocalVariables::find_any</b>:<br><a href="24-lv.html#SP20">&#167;20</a></span></button></span><span class="plain">(</span><span class="reserved">locals_slate</span><span class="plain"> *</span><span class="identifier">slate</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">slate</span><span class="plain">-&gt;</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b>Thus:
</p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::by_name<button class="popup" onclick="togglePopup('usagePopup1873')">...<span class="popuptext" id="usagePopup1873">Usage of <b>LocalVariables::by_name</b>:<br>Lvalues - <a href="14-lv.html#SP14_5">&#167;14.5</a><br>Compile Invocations Inline - <a href="25-cii.html#SP6">&#167;6</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP19">LocalVariables::find_i6_var</a></span><span class="plain">(&amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">), </span><span class="identifier">name</span><span class="plain">, </span><span class="constant">INTERNAL_USE_LV</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::by_name_any<button class="popup" onclick="togglePopup('usagePopup1874')">...<span class="popuptext" id="usagePopup1874">Usage of <b>LocalVariables::by_name_any</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP19">LocalVariables::find_any</a></span><span class="plain">(&amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">), </span><span class="identifier">name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::phrase_options<button class="popup" onclick="togglePopup('usagePopup1875')">...<span class="popuptext" id="usagePopup1875">Usage of <b>LocalVariables::phrase_options</b>:<br>Conditions - <a href="14-cn.html#SP16_3">&#167;16.3</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP19">LocalVariables::find_i6_var</a></span><span class="plain">(&amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"phrase_options"</span><span class="plain">, </span><span class="constant">OTHER_CALL_PARAMETER_LV</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b></p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::find_pcalc_var<button class="popup" onclick="togglePopup('usagePopup1876')">...<span class="popuptext" id="usagePopup1876">Usage of <b>LocalVariables::find_pcalc_var</b>:<br>Terms - <a href="11-tr.html#SP10">&#167;10</a></span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">locals_slate</span><span class="plain"> *</span><span class="identifier">slate</span><span class="plain"> = &amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">slate</span><span class="plain">-&gt;</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">) == </span><span class="constant">1</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">, </span><span class="constant">0</span><span class="plain">) == </span><span class="identifier">pcalc_vars</span><span class="plain">[</span><span class="identifier">v</span><span class="plain">])</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::find_const_var<button class="popup" onclick="togglePopup('usagePopup1877')">...<span class="popuptext" id="usagePopup1877">Usage of <b>LocalVariables::find_const_var</b>:<br>Cinders and Deferrals - <a href="12-cad.html#SP7">&#167;7</a></span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"const_%d"</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">, *</span><span class="identifier">found</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">locals_slate</span><span class="plain"> *</span><span class="identifier">slate</span><span class="plain"> = &amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">slate</span><span class="plain">-&gt;</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">))</span>
<span class="identifier">found</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">found</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b>And, a little cheekily,
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LocalVariables::are_we_using_table_lookup<button class="popup" onclick="togglePopup('usagePopup1878')">...<span class="popuptext" id="usagePopup1878">Usage of <b>LocalVariables::are_we_using_table_lookup</b>:<br>Type Expressions and Values - <a href="10-teav.html#SP21_1">&#167;21.1</a><br>Compile Deferred Propositions - <a href="12-cdp.html#SP2_1_3">&#167;2.1.3</a><br>Chronology - <a href="24-ch.html#SP6">&#167;6</a>, <a href="24-ch.html#SP7_4">&#167;7.4</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="24-lv.html#SP19">LocalVariables::find_i6_var</a></span><span class="plain">(&amp;(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"ct_0"</span><span class="plain">, </span><span class="constant">INTERNAL_USE_LV</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>Another way to search is by index. The following, for instance, returns
the ith call parameter on the current slate (counting from 0), or <code class="display"><span class="extract">NULL</span></code> if
there isn't one.
</p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::get_ith_parameter<button class="popup" onclick="togglePopup('usagePopup1879')">...<span class="popuptext" id="usagePopup1879">Usage of <b>LocalVariables::get_ith_parameter</b>:<br><a href="24-lv.html#SP26">&#167;26</a>, Phrase Type Data - <a href="22-ptd.html#SP20">&#167;20</a></span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no stack frame exists"</span><span class="plain">);</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="constant">TOKEN_CALL_PARAMETER_LV</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">++ == </span><span class="identifier">i</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b>The main way to search the slate, though, is by source-text name: in other
words, by parsing.
</p>
<p class="inwebparagraph">Because local variables come and go on the breeze, we parse them by hand
rather than with the excerpt parser's symbols table. (Experiment shows that
this is better, and that there's a reward for not allowing the hash table
of excerpts to grow, contrary to the general experience with C-like
compiler symbols tables.) All the same we make use of the excerpt hashing
function, to reuse as much earlier work as possible, and the following is
very fast.
</p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::parse<button class="popup" onclick="togglePopup('usagePopup1880')">...<span class="popuptext" id="usagePopup1880">Usage of <b>LocalVariables::parse</b>:<br><a href="24-lv.html#SP33">&#167;33</a>, Type Expressions and Values - <a href="10-teav.html#SP15">&#167;15</a><br>Equations - <a href="20-eq.html#SP47_3">&#167;47.3</a><br>Compile Invocations Inline - <a href="25-cii.html#SP5_1">&#167;5.1</a>, <a href="25-cii.html#SP6">&#167;6</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</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="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP24">LocalVariables::parse_inner</a></span><span class="plain">(</span><span class="identifier">phsf</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">) </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">parsed_recently</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::parse_inner<button class="popup" onclick="togglePopup('usagePopup1881')">...<span class="popuptext" id="usagePopup1881">Usage of <b>LocalVariables::parse_inner</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</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="reserved">if</span><span class="plain"> ((</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="identifier">local_value_variables</span><span class="plain">.</span><span class="identifier">it_variable_exists</span><span class="plain">) &amp;&amp; (&lt;</span><span class="identifier">pronoun</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP26">LocalVariables::it_variable</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">definite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Articles::remove_the</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">it_pseudonym</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">it_pseudonym</span><span class="plain">)))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP26">LocalVariables::it_variable</a></span><span class="plain">();</span>
&lt;<span class="cwebmacro">Parse the locals directly</span> <span class="cwebmacronumber">24.1</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP24_1"></a><b>&#167;24.1. </b>Earlier builds of Inform went to some trouble to parse these in reverse
creation order, so that if the same name existed both as a loop variable
and outside it, the inner one would always be parsed &mdash; compare C, where
this is legal (if doubtful in style). But since the Inform language no
longer permits local names to be overloaded like this, there's no longer
any need.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Parse the locals directly</span> <span class="cwebmacronumber">24.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">h</span><span class="plain"> = </span><span class="identifier">ExcerptMeanings::hash_code</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">h</span><span class="plain"> == </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">name_hash</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">allocated</span><span class="plain"> == </span><span class="identifier">TRUE</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">)))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="24-lv.html#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">stack_selection_used_recently</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::monitor_local_parsing<button class="popup" onclick="togglePopup('usagePopup1882')">...<span class="popuptext" id="usagePopup1882">Usage of <b>LocalVariables::monitor_local_parsing</b>:<br>Text Substitutions - <a href="17-ts.html#SP11">&#167;11</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">parsed_recently</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">stack_selection_used_recently</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::used_stack_selection<button class="popup" onclick="togglePopup('usagePopup1883')">...<span class="popuptext" id="usagePopup1883">Usage of <b>LocalVariables::used_stack_selection</b>:<br>Lvalues - <a href="14-lv.html#SP14_5">&#167;14.5</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">stack_selection_used_recently</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LocalVariables::local_parsed_recently<button class="popup" onclick="togglePopup('usagePopup1884')">...<span class="popuptext" id="usagePopup1884">Usage of <b>LocalVariables::local_parsed_recently</b>:<br>Text Substitutions - <a href="17-ts.html#SP11">&#167;11</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">parsed_recently</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stack_selection_used_recently</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. It. </b>"It", when it's allowed, refers always to the first call parameter. This is
used, for instance, in defining adjectives by phrases, where the value which
is to be judged goes in to the first call parameter. (The variable's name
is sometimes needed when the stack frame doesn't exist yet, so we occasionally
fake up a call parameter pro tem.)
</p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::it_variable<button class="popup" onclick="togglePopup('usagePopup1885')">...<span class="popuptext" id="usagePopup1885">Usage of <b>LocalVariables::it_variable</b>:<br><a href="24-lv.html#SP24">&#167;24</a>, Adjective Meanings - <a href="4-am.html#SP33_2">&#167;33.2</a>, <a href="4-am.html#SP38_1">&#167;38.1</a><br>Type Expressions and Values - <a href="10-teav.html#SP10_1">&#167;10.1</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP23">LocalVariables::get_ith_parameter</a></span><span class="plain">(0);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP7">LocalVariables::add_to_locals_slate</a></span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">TOKEN_CALL_PARAMETER_LV</span><span class="plain">,</span>
<span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>Sometimes "its", "his", "her" or "their" is allowed too:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LocalVariables::is_possessive_form_of_it_enabled<button class="popup" onclick="togglePopup('usagePopup1886')">...<span class="popuptext" id="usagePopup1886">Usage of <b>LocalVariables::is_possessive_form_of_it_enabled</b>:<br>Type Expressions and Values - <a href="10-teav.html#SP8">&#167;8</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">its_form_allowed</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::enable_possessive_form_of_it<button class="popup" onclick="togglePopup('usagePopup1887')">...<span class="popuptext" id="usagePopup1887">Usage of <b>LocalVariables::enable_possessive_form_of_it</b>:<br>Adjective Meanings - <a href="4-am.html#SP33_2_1">&#167;33.2.1</a><br>Relations - <a href="6-rlt.html#SP30">&#167;30</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no stack frame exists"</span><span class="plain">);</span>
<span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">its_form_allowed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_pronoun<button class="popup" onclick="togglePopup('usagePopup1888')">...<span class="popuptext" id="usagePopup1888">Usage of <b>LocalVariables::add_pronoun</b>:<br>Adjective Meanings - <a href="4-am.html#SP33_2_1">&#167;33.2.1</a><br>Phrases - <a href="22-ph.html#SP6_7_1">&#167;6.7.1</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</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">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">it_variable_exists</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP8">LocalVariables::add_call_parameter</a></span><span class="plain">(</span><span class="identifier">phsf</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">LocalVariables::add_pronoun_as_symbol<button class="popup" onclick="togglePopup('usagePopup1889')">...<span class="popuptext" id="usagePopup1889">Usage of <b>LocalVariables::add_pronoun_as_symbol</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</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">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">it_variable_exists</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">v</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP8">LocalVariables::add_call_parameter</a></span><span class="plain">(</span><span class="identifier">phsf</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">8</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::alias_pronoun<button class="popup" onclick="togglePopup('usagePopup1890')">...<span class="popuptext" id="usagePopup1890">Usage of <b>LocalVariables::alias_pronoun</b>:<br>Adjectives by Condition - <a href="23-abc.html#SP1">&#167;1</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</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">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">it_pseudonym</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. Local Parking. </b>This is a tricksy little manoeuvre. Suppose we're about to call a function
in our compiled code, and it's a function with no arguments, but we want
our current locals to be still visible from inside it. What we do is to
park the values of the locals into a little scratch array before the call...
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::compile_storage<button class="popup" onclick="togglePopup('usagePopup1891')">...<span class="popuptext" id="usagePopup1891">Usage of <b>LocalVariables::compile_storage</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(LocalParking--&gt;%d=%~L),"</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">++, </span><span class="identifier">lvar</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LocalVariables::emit_storage<button class="popup" onclick="togglePopup('usagePopup1892')">...<span class="popuptext" id="usagePopup1892">Usage of <b>LocalVariables::emit_storage</b>:<br>Text Substitutions - <a href="17-ts.html#SP8">&#167;8</a><br>Responses - <a href="17-rs.html#SP12_1_1">&#167;12.1.1</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">NC</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">) {</span>
<span class="identifier">NC</span><span class="plain">++;</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">SEQUENTIAL_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">LOOKUPREF_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext"><a href="27-hr.html#SP4">Hierarchy::find</a></span><span class="plain">(</span><span class="constant">LOCALPARKING_HL</span><span class="plain">));</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">++);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">lvar_s</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">8</span><span class="plain">);</span>
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">lvar_s</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NC</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. </b>...and then fish them out again as the first thing happening inside the
function, i.e., immediately after the call.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::compile_retrieval<button class="popup" onclick="togglePopup('usagePopup1893')">...<span class="popuptext" id="usagePopup1893">Usage of <b>LocalVariables::compile_retrieval</b>:<br>Text Substitutions - <a href="17-ts.html#SP11">&#167;11</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">LP</span><span class="plain"> = </span><span class="functiontext"><a href="27-hr.html#SP4">Hierarchy::find</a></span><span class="plain">(</span><span class="constant">LOCALPARKING_HL</span><span class="plain">);</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">) {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">1</span><span class="plain">));</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">LOOKUP_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">LP</span><span class="plain">);</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">++);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. Equation terms. </b>Another use for local variables is as the terms in an equation.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::make_available_to_equation<button class="popup" onclick="togglePopup('usagePopup1894')">...<span class="popuptext" id="usagePopup1894">Usage of <b>LocalVariables::make_available_to_equation</b>:<br>Equations - <a href="20-eq.html#SP20">&#167;20</a></span></button></span><span class="plain">(</span><span class="reserved">equation</span><span class="plain"> *</span><span class="identifier">eqn</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">allocated</span><span class="plain">)</span>
<span class="functiontext"><a href="20-eq.html#SP20">Equations::declare_local</a></span><span class="plain">(</span><span class="identifier">eqn</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">kind_as_declared</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. Callings. </b>A "calling" is a declaration of the "(called X)" sort. The word range here is
the text "X":
</p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::ensure_called_local<button class="popup" onclick="togglePopup('usagePopup1895')">...<span class="popuptext" id="usagePopup1895">Usage of <b>LocalVariables::ensure_called_local</b>:<br><a href="24-lv.html#SP32">&#167;32</a>, Constants and Descriptions - <a href="10-cad.html#SP19_2">&#167;19.2</a><br>Compile Atoms - <a href="12-ca.html#SP6_1">&#167;6.1</a><br>Deciding to Defer - <a href="12-dtd.html#SP9_2">&#167;9.2</a></span></button></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">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment"> in case callings are made from parsing alone</span>
<span class="plain">&lt;</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">called</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="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</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">lvar</span><span class="plain">) &amp;&amp; (</span><span class="identifier">K</span><span class="plain">)) </span><span class="functiontext"><a href="24-lv.html#SP38">LocalVariables::set_kind</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. </b>The following rather inelegantly picks up any apparent callings in some text.
</p>
<pre class="display">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">last_mnc_wording</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING_INIT</span><span class="plain">;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">PM_CalledWithDash_wording</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING_INIT</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::make_necessary_callings<button class="popup" onclick="togglePopup('usagePopup1896')">...<span class="popuptext" id="usagePopup1896">Usage of <b>LocalVariables::make_necessary_callings</b>:<br>Architecture of the S-Parser - <a href="10-aots.html#SP4">&#167;4</a>, <a href="10-aots.html#SP5">&#167;5</a></span></button></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="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::within</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">last_mnc_wording</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">last_mnc_wording</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">including</span><span class="plain">-</span><span class="identifier">a</span><span class="plain">-</span><span class="identifier">calling</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">text</span><span class="plain">-</span><span class="identifier">including</span><span class="plain">-</span><span class="identifier">a</span><span class="plain">-</span><span class="identifier">calling</span><span class="plain">&gt;, </span><span class="constant">2</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">text</span><span class="plain">-</span><span class="identifier">including</span><span class="plain">-</span><span class="identifier">a</span><span class="plain">-</span><span class="identifier">calling</span><span class="plain">&gt;, </span><span class="constant">3</span><span class="plain">);</span>
<span class="functiontext"><a href="24-lv.html#SP31">LocalVariables::ensure_called_local</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. </b>When a calling is found in, for instance, a description like this:
</p>
<blockquote>
<p>a body which is part of a person (called the owner)</p>
</blockquote>
<p class="inwebparagraph">the text after "called" is run through the following.
</p>
<p class="inwebparagraph">Note that production (b) of &lt;new-called-name-unarticled&gt; checks
to see if the name already has a meaning. However, a match against (b) is
disregarded if the meaning is one of those allowed to be overridden: at
present, a global variable, an object name, a table column name, a property
name or a description.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">called</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">definite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">&gt; &lt;</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">called</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; | ==&gt; *</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[2]; *</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">new</span><span class="plain">-</span><span class="identifier">called</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; ==&gt; *</span><span class="identifier">X</span><span class="plain"> = </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">[1]</span>
<span class="plain">&lt;</span><span class="identifier">new</span><span class="plain">-</span><span class="identifier">called</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">unarticled</span><span class="plain">&gt; ::=</span>
<span class="plain">*** - *** | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_CalledWithDash problem</span> <span class="cwebmacronumber">33.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">existing</span><span class="plain">-</span><span class="identifier">local</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; | ==&gt; *</span><span class="identifier">X</span><span class="plain"> = </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">[1]</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">-</span><span class="identifier">or</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Vet to see if this name can be overloaded</span> <span class="cwebmacronumber">33.2</span>&gt;
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Make a new local for this calling</span> <span class="cwebmacronumber">33.3</span>&gt;
<span class="plain">&lt;</span><span class="identifier">existing</span><span class="plain">-</span><span class="identifier">local</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; </span><span class="identifier">internal</span><span class="plain"> {</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP24">LocalVariables::parse</a></span><span class="plain">(</span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">(), </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (*</span><span class="identifier">XP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP33_1"></a><b>&#167;33.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_CalledWithDash problem</span> <span class="cwebmacronumber">33.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; *</span><span class="identifier">XP</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">Wordings::eq</span><span class="plain">(</span><span class="identifier">PM_CalledWithDash_wording</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">))) {</span>
<span class="identifier">PM_CalledWithDash_wording</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CalledWithDash</span><span class="plain">),</span>
<span class="string">"a '(called ...)' name is not allowed to include a hyphen"</span><span class="plain">,</span>
<span class="string">"since this would look misleadingly like a declaration of kind of value it has."</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="24-lv.html#SP33">&#167;33</a>.</p>
<p class="inwebparagraph"><a id="SP33_2"></a><b>&#167;33.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Vet to see if this name can be overloaded</span> <span class="cwebmacronumber">33.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">already</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="functiontext"><a href="24-lv.html#SP34">LocalVariables::permit_as_new_local</a></span><span class="plain">(</span><span class="identifier">already</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Meaning already existing: $T\n"</span><span class="plain">, </span><span class="identifier">already</span><span class="plain">);</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="14-sp.html#SP2">Specifications::is_kind_like</a></span><span class="plain">(</span><span class="identifier">already</span><span class="plain">))</span>
<span class="identifier">Problems::quote_text</span><span class="plain">(3, </span><span class="string">"a kind"</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="functiontext"><a href="2-sq.html#SP4">Problems::quote_kind_of</a></span><span class="plain">(3, </span><span class="identifier">already</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_CalledOverloaded</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"In %1, it looks as if '%2' is going to be a temporary name which something "</span>
<span class="string">"will be called. But I can't allow that, because it already has a meaning "</span>
<span class="string">"as %3."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="24-lv.html#SP33">&#167;33</a>.</p>
<p class="inwebparagraph"><a id="SP33_3"></a><b>&#167;33.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make a new local for this calling</span> <span class="cwebmacronumber">33.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = (</span><span class="identifier">phsf</span><span class="plain">)?(</span><span class="functiontext"><a href="24-lv.html#SP10">LocalVariables::new</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)):</span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="24-lv.html#SP33">&#167;33</a>.</p>
<p class="inwebparagraph"><a id="SP34"></a><b>&#167;34. Permissible names. </b>This is an interesting issue of policy. Suppose the source text says:
</p>
<blockquote>
<p>let the slate be 1;</p>
</blockquote>
<p class="inwebparagraph">and, far away, an object called "the slate" is sitting on a schoolroom desk.
Do we allow this, thus temporarily changing the meaning of "slate", or do
we throw it out with a problem message? If we allow it, we enable source text
to become less clear, since meaning now depends on context. If we forbid it,
we cause all sorts of things to go wrong with extensions (including not least
the Standard Rules): because suppose they contain a local called "slate"
somewhere, and then the unsuspecting user writes
</p>
<blockquote>
<p>The slate is on the desk.</p>
</blockquote>
<p class="inwebparagraph">Now there's a conflict, and the user will be baffled, never having read the
extension he's using. So we do allow this, and certain other overloadings
of meanings, too, but it would be too much to say that every phrase has its
own namespace.
</p>
<p class="inwebparagraph">Callings get one extra benefit, because they typically exist more fleetingly &mdash;
often only for the sentence where they're defined &mdash; and because the syntax
is more explicit. So you can write:
</p>
<blockquote>
<p>if an infected person can see a clean person (called random bystander), ...</p>
</blockquote>
<p class="inwebparagraph">even if "random bystander" might otherwise be a request to randomly generate
an instance of the kind "bystander".
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LocalVariables::permit_as_new_local<button class="popup" onclick="togglePopup('usagePopup1897')">...<span class="popuptext" id="usagePopup1897">Usage of <b>LocalVariables::permit_as_new_local</b>:<br><a href="24-lv.html#SP33_2">&#167;33.2</a>, Dash - <a href="14-ds2.html#SP11_8">&#167;11.8</a></span></button></span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">found</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">as_calling</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">found</span><span class="plain">, </span><span class="identifier">AMBIGUITY_NT</span><span class="plain">)) </span><span class="identifier">found</span><span class="plain"> = </span><span class="identifier">found</span><span class="plain">-&gt;</span><span class="element">down</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext"><a href="14-sp.html#SP2">Specifications::is_kind_like</a></span><span class="plain">(</span><span class="identifier">found</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="functiontext"><a href="14-sp.html#SP1">Specifications::to_kind</a></span><span class="plain">(</span><span class="identifier">found</span><span class="plain">), </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">found</span><span class="plain">, </span><span class="constant">UNKNOWN_NT</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">found</span><span class="plain">, </span><span class="constant">NONLOCAL_VARIABLE_NT</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext"><a href="14-sp.html#SP3">Specifications::is_description</a></span><span class="plain">(</span><span class="identifier">found</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext"><a href="14-rv.html#SP4">Rvalues::is_object</a></span><span class="plain">(</span><span class="identifier">found</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext"><a href="14-rv.html#SP3">Rvalues::to_instance</a></span><span class="plain">(</span><span class="identifier">found</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext"><a href="14-rv.html#SP19">Rvalues::is_CONSTANT_construction</a></span><span class="plain">(</span><span class="identifier">found</span><span class="plain">, </span><span class="identifier">CON_table_column</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext"><a href="14-rv.html#SP19">Rvalues::is_CONSTANT_construction</a></span><span class="plain">(</span><span class="identifier">found</span><span class="plain">, </span><span class="identifier">CON_property</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">as_calling</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="7-ptu.html#SP12">ParseTreeUsage::is_phrasal</a></span><span class="plain">(</span><span class="identifier">found</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP35"></a><b>&#167;35. Logging. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::log<button class="popup" onclick="togglePopup('usagePopup1898')">...<span class="popuptext" id="usagePopup1898">Usage of <b>LocalVariables::log</b>:<br>Core Module - <a href="1-cm.html#SP5">&#167;5</a>, <a href="1-cm.html#SP6_6">&#167;6.6</a><br>Stack Frames - <a href="24-sf.html#SP13">&#167;13</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">allocated</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) { </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"LV&lt;unallocated&gt;"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">)) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"LV\"%W\""</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"LV&lt;nameless&gt;"</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"-$u"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">kind_as_declared</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP36"></a><b>&#167;36. </b>And for run-time debugging in a similar vein:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::describe_repetition_local<button class="popup" onclick="togglePopup('usagePopup1899')">...<span class="popuptext" id="usagePopup1899">Usage of <b>LocalVariables::describe_repetition_local</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lvar</span><span class="plain">) &amp;&amp; (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_purpose</span><span class="plain"> == </span><span class="constant">LET_VALUE_LV</span><span class="plain">)) </span><span class="comment"> should always be true</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"[repetition with %+W set to \", (%n) %~L, \"]^\";\n"</span><span class="plain">,</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">,</span>
<span class="identifier">Kinds::Behaviour::get_iname</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">kind_as_declared</span><span class="plain">),</span>
<span class="identifier">lvar</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP37"></a><b>&#167;37. Kind. </b>Of a single variable:
</p>
<pre class="display">
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">LocalVariables::kind<button class="popup" onclick="togglePopup('usagePopup1900')">...<span class="popuptext" id="usagePopup1900">Usage of <b>LocalVariables::kind</b>:<br><a href="24-lv.html#SP43">&#167;43</a>, Dash - <a href="14-ds2.html#SP19_6_1_1">&#167;19.6.1.1</a><br>Equations - <a href="20-eq.html#SP47_3_2">&#167;47.3.2</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Tried to find kind of nonexistent local variable"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">kind_as_declared</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">LocalVariables::unproblematic_kind<button class="popup" onclick="togglePopup('usagePopup1901')">...<span class="popuptext" id="usagePopup1901">Usage of <b>LocalVariables::unproblematic_kind</b>:<br>Lvalues - <a href="14-lv.html#SP11">&#167;11</a>, <a href="14-lv.html#SP12_1">&#167;12.1</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP37">LocalVariables::kind</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP38"></a><b>&#167;38. </b>Locals are sometimes created before their kinds are known, so this call
exists to fix that:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::set_kind<button class="popup" onclick="togglePopup('usagePopup1902')">...<span class="popuptext" id="usagePopup1902">Usage of <b>LocalVariables::set_kind</b>:<br><a href="24-lv.html#SP31">&#167;31</a>, <a href="24-lv.html#SP47">&#167;47</a>, Deciding to Defer - <a href="12-dtd.html#SP27">&#167;27</a><br>Equations - <a href="20-eq.html#SP47_3_2">&#167;47.3.2</a><br>Phrase Type Data - <a href="22-ptd.html#SP20">&#167;20</a><br>Compile Invocations Inline - <a href="25-cii.html#SP3_5_1_1_1">&#167;3.5.1.1.1</a><br>Compile Phrases - <a href="25-cp.html#SP5_3_5_3">&#167;5.3.5.3</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Tried to set kind of nonexistent local variable"</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">LOCAL_VARIABLES</span><span class="plain">, </span><span class="string">"Kind of local $k set to $u\n"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">kind_as_declared</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP39"></a><b>&#167;39. Protection. </b>From being changed by "let", that is. Loop counters are protected, but that's
about it; call parameters aren't, for instance, though it would be a simple
change to make them so. (In the Examples suite as of March 2012, there are
only two points where call parameters are altered. Still, it didn't seem
worth making the change, even though the disruption would be small.)
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::unprotect<button class="popup" onclick="togglePopup('usagePopup1903')">...<span class="popuptext" id="usagePopup1903">Usage of <b>LocalVariables::unprotect</b>:<br>Compile Invocations Inline - <a href="25-cii.html#SP3_5_2">&#167;3.5.2</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="constant">LET_VALUE_LV</span><span class="plain">)</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">protected</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LocalVariables::protected<button class="popup" onclick="togglePopup('usagePopup1904')">...<span class="popuptext" id="usagePopup1904">Usage of <b>LocalVariables::protected</b>:<br>Dash - <a href="14-ds2.html#SP11_9_1_1_5">&#167;11.9.1.1.5</a><br>Compile Invocations Inline - <a href="25-cii.html#SP3_5_4_2">&#167;3.5.4.2</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="constant">LET_VALUE_LV</span><span class="plain">) &amp;&amp; (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">protected</span><span class="plain">)) {</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">varname</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ProtectedFromLet</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"In %1, it looks as if you want to use 'let' to change the value of "</span>
<span class="string">"the temporary variable '%2'. Ordinarily that would be fine, but it's "</span>
<span class="string">"not allowed when the variable is used as the counter in a 'repeat' "</span>
<span class="string">"loop, or has some other do-not-disturb purpose - this could cause "</span>
<span class="string">"chaotic effects. The rule is: you can only change an existing value "</span>
<span class="string">"with 'let' if it was created by 'let' in the first place."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP40"></a><b>&#167;40. Block scope. </b>At every position in a phrase definition we have a "scope level" number S.
This begins at 0; when a block begins, usually as a loop body, it increments,
and when the block ends it decrements.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::set_scope_to<button class="popup" onclick="togglePopup('usagePopup1905')">...<span class="popuptext" id="usagePopup1905">Usage of <b>LocalVariables::set_scope_to</b>:<br>Phrase Blocks - <a href="24-pb.html#SP18">&#167;18</a>, <a href="24-pb.html#SP19">&#167;19</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">s</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">lvar</span><span class="plain">) &amp;&amp; (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_purpose</span><span class="plain"> == </span><span class="constant">LET_VALUE_LV</span><span class="plain">)) {</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">block_scope</span><span class="plain"> = </span><span class="identifier">s</span><span class="plain">;</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">LOCAL_VARIABLES</span><span class="plain">, </span><span class="string">"Setting scope of $k to block level %d\n"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">s</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP41"></a><b>&#167;41. </b>And here is the reckoning when scope level S ends:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::mark_to_free_at_end_of_scope<button class="popup" onclick="togglePopup('usagePopup1906')">...<span class="popuptext" id="usagePopup1906">Usage of <b>LocalVariables::mark_to_free_at_end_of_scope</b>:<br>Deciding to Defer - <a href="12-dtd.html#SP27">&#167;27</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">) {</span>
<span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">free_at_end_of_scope</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::end_scope<button class="popup" onclick="togglePopup('usagePopup1907')">...<span class="popuptext" id="usagePopup1907">Usage of <b>LocalVariables::end_scope</b>:<br>Phrase Blocks - <a href="24-pb.html#SP13">&#167;13</a>, <a href="24-pb.html#SP14">&#167;14</a></span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"relinquishing locals where no stack frame exists"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">s</span><span class="plain"> &lt;= </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"the outermost scope cannot end"</span><span class="plain">);</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="constant">LET_VALUE_LV</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">allocated</span><span class="plain">) &amp;&amp; (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">block_scope</span><span class="plain"> &gt;= </span><span class="identifier">s</span><span class="plain">)) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">LOCAL_VARIABLES</span><span class="plain">, </span><span class="string">"De-allocating $k at end of block\n"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">free_at_end_of_scope</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext"><a href="27-hr.html#SP4">Hierarchy::find</a></span><span class="plain">(</span><span class="constant">BLKVALUEFREE_HL</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">LN</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">2</span><span class="plain">);</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">LN</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="plain">}</span>
<span class="functiontext"><a href="24-lv.html#SP15">LocalVariables::deallocate</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext"><a href="10-aots.html#SP14">ExParser::warn_expression_cache</a></span><span class="plain">();</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP42"></a><b>&#167;42. </b>This rather fatuous routine is used only for describing repetitions in
testing output (see above): in other circumstances it wouldn't give the
right result, so don't use it for anything else.
</p>
<pre class="display">
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="functiontext">LocalVariables::latest_repeat_variable<button class="popup" onclick="togglePopup('usagePopup1908')">...<span class="popuptext" id="usagePopup1908">Usage of <b>LocalVariables::latest_repeat_variable</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext"><a href="24-sf.html#SP8">Frames::current_stack_frame</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> = </span><span class="functiontext"><a href="24-pb.html#SP16">Frames::Blocks::current_block_level</a></span><span class="plain">();</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="constant">LET_VALUE_LV</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">allocated</span><span class="plain">) &amp;&amp; (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">block_scope</span><span class="plain"> == </span><span class="identifier">s</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP43"></a><b>&#167;43. Callings. </b>We need to keep track of the callings made in any condition so that the
variables, which generally have a scope extending beyond that condition,
can't be left with kind-unsafe (or no) values. For example, if:
</p>
<blockquote>
<p>if a device (called the mechanism) is switched on: ...</p>
</blockquote>
<p class="inwebparagraph">turns out false, then "mechanism" has to be safely defused to some kind-safe
value.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_CALLINGS_IN_MATCH</span><span class="plain"> </span><span class="constant">128</span>
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">current_session_number</span><span class="plain"> = -1;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">callings_in_condition_sp</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">callings_session_number</span><span class="plain">[</span><span class="constant">MAX_CALLINGS_IN_MATCH</span><span class="plain">];</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">callings_in_condition</span><span class="plain">[</span><span class="constant">MAX_CALLINGS_IN_MATCH</span><span class="plain">];</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::add_calling_to_condition<button class="popup" onclick="togglePopup('usagePopup1909')">...<span class="popuptext" id="usagePopup1909">Usage of <b>LocalVariables::add_calling_to_condition</b>:<br>Deciding to Defer - <a href="12-dtd.html#SP9">&#167;9</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_session_number</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no PM session"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">callings_in_condition_sp</span><span class="plain"> + </span><span class="constant">1</span><span class="plain"> == </span><span class="constant">MAX_CALLINGS_IN_MATCH</span><span class="plain">)</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">), </span><span class="comment"> or very hard, anyway</span>
<span class="string">"that makes too complicated a condition to test"</span><span class="plain">,</span>
<span class="string">"with all of those clauses involving 'called' values."</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">callings_session_number</span><span class="plain">[</span><span class="identifier">callings_in_condition_sp</span><span class="plain">] = </span><span class="identifier">current_session_number</span><span class="plain">;</span>
<span class="identifier">callings_in_condition</span><span class="plain">[</span><span class="identifier">callings_in_condition_sp</span><span class="plain">++] = </span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::begin_condition_emit<button class="popup" onclick="togglePopup('usagePopup1910')">...<span class="popuptext" id="usagePopup1910">Usage of <b>LocalVariables::begin_condition_emit</b>:<br>Deciding to Defer - <a href="12-dtd.html#SP7_1">&#167;7.1</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">current_session_number</span><span class="plain">++;</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">OR_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::end_condition_emit<button class="popup" onclick="togglePopup('usagePopup1911')">...<span class="popuptext" id="usagePopup1911">Usage of <b>LocalVariables::end_condition_emit</b>:<br>Deciding to Defer - <a href="12-dtd.html#SP7_1">&#167;7.1</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_session_number</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unstarted PM session"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">NC</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">callings_in_condition_sp</span><span class="plain">, </span><span class="identifier">downs</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">x</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">callings_session_number</span><span class="plain">[</span><span class="identifier">x</span><span class="plain">-1] == </span><span class="identifier">current_session_number</span><span class="plain">)) {</span>
<span class="identifier">NC</span><span class="plain">++;</span>
<span class="identifier">x</span><span class="plain">--;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NC</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">SEQUENTIAL_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">()); </span><span class="identifier">downs</span><span class="plain">++;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">NM</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">inner_downs</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">callings_in_condition_sp</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">callings_session_number</span><span class="plain">[</span><span class="identifier">callings_in_condition_sp</span><span class="plain">-1] == </span><span class="identifier">current_session_number</span><span class="plain">)) {</span>
<span class="identifier">NM</span><span class="plain">++;</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">callings_in_condition</span><span class="plain">[</span><span class="identifier">callings_in_condition_sp</span><span class="plain">-1];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NM</span><span class="plain"> &lt; </span><span class="identifier">NC</span><span class="plain">) { </span><span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">SEQUENTIAL_BIP</span><span class="plain">); </span><span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">()); </span><span class="identifier">inner_downs</span><span class="plain">++; }</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">lvar_s</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">8</span><span class="plain">);</span>
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">lvar_s</span><span class="plain">);</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP37">LocalVariables::kind</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Kinds::Behaviour::definite</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="functiontext"><a href="13-rsfk.html#SP4">Kinds::RunTime::emit_default_value_as_val</a></span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="string">"'called' value"</span><span class="plain">) != </span><span class="identifier">TRUE</span><span class="plain">))</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">());</span>
<span class="identifier">callings_in_condition_sp</span><span class="plain">--;</span>
<span class="plain">}</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">inner_downs</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">inner_downs</span><span class="plain">--; </span><span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">()); }</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">current_session_number</span><span class="plain">--;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">downs</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">downs</span><span class="plain">--; </span><span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">()); }</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP44"></a><b>&#167;44. Writer. </b>Lastly we get to run-time compilation. Writing <code class="display"><span class="extract">%~L</span></code> gives code for an I6
lvalue which can be used to evaluate or assign to the variable:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::writer<button class="popup" onclick="togglePopup('usagePopup1912')">...<span class="popuptext" id="usagePopup1912">Usage of <b>LocalVariables::writer</b>:<br>Core Module - <a href="1-cm.html#SP6_3">&#167;6.3</a></span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vL</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = (</span><span class="reserved">local_variable</span><span class="plain"> *) </span><span class="identifier">vL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no such variable"</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">format_string</span><span class="plain">[0]) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'L'</span><span class="plain">: /* </span><span class="identifier">bare</span><span class="plain"> |%</span><span class="identifier">L</span><span class="plain">| </span><span class="identifier">means</span><span class="plain"> </span><span class="identifier">the</span><span class="plain"> </span><span class="identifier">same</span><span class="plain"> </span><span class="identifier">as</span><span class="plain"> |%+</span><span class="identifier">L</span><span class="plain">|, </span><span class="identifier">so</span><span class="plain"> </span><span class="identifier">fall</span><span class="plain"> </span><span class="identifier">through</span><span class="plain"> </span><span class="identifier">to</span><span class="plain">... */</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'+'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'-'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%-W"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'~'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad %L modifier"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP45"></a><b>&#167;45. </b>And here is a comma-separated list (possibly empty) of just the call
parameters:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::compile_parameter_list<button class="popup" onclick="togglePopup('usagePopup1913')">...<span class="popuptext" id="usagePopup1913">Usage of <b>LocalVariables::compile_parameter_list</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_vars</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">purpose</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">purpose</span><span class="plain"> = </span><span class="constant">TOKEN_CALL_PARAMETER_LV</span><span class="plain">; </span><span class="identifier">purpose</span><span class="plain"> &lt;= </span><span class="constant">OTHER_CALL_PARAMETER_LV</span><span class="plain">; </span><span class="identifier">purpose</span><span class="plain">++) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="identifier">purpose</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_vars</span><span class="plain">++ &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", "</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%~L"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::emit_parameter_list<button class="popup" onclick="togglePopup('usagePopup1914')">...<span class="popuptext" id="usagePopup1914">Usage of <b>LocalVariables::emit_parameter_list</b>:<br>Routines - <a href="26-rt.html#SP4_1_3">&#167;4.1.3</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">purpose</span><span class="plain"> = </span><span class="constant">TOKEN_CALL_PARAMETER_LV</span><span class="plain">; </span><span class="identifier">purpose</span><span class="plain"> &lt;= </span><span class="constant">OTHER_CALL_PARAMETER_LV</span><span class="plain">; </span><span class="identifier">purpose</span><span class="plain">++) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="identifier">purpose</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">vs</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="constant">3</span><span class="plain">);</span>
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">vs</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP46"></a><b>&#167;46. </b></p>
<pre class="display">
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">LocalVariables::deduced_function_kind<button class="popup" onclick="togglePopup('usagePopup1915')">...<span class="popuptext" id="usagePopup1915">Usage of <b>LocalVariables::deduced_function_kind</b>:<br>Routines - <a href="26-rt.html#SP4">&#167;4</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pc</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="constant">TOKEN_CALL_PARAMETER_LV</span><span class="plain">) || (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_purpose</span><span class="plain"> == </span><span class="constant">OTHER_CALL_PARAMETER_LV</span><span class="plain">))</span>
<span class="identifier">pc</span><span class="plain">++;</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K_array</span><span class="plain">[128];</span>
<span class="identifier">pc</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="constant">TOKEN_CALL_PARAMETER_LV</span><span class="plain">) || (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_purpose</span><span class="plain"> == </span><span class="constant">OTHER_CALL_PARAMETER_LV</span><span class="plain">))</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pc</span><span class="plain"> &lt; </span><span class="constant">128</span><span class="plain">) {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">OK</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">kind_as_declared</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">OK</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">OK</span><span class="plain"> == </span><span class="identifier">K_nil</span><span class="plain">)) </span><span class="identifier">OK</span><span class="plain"> = </span><span class="identifier">K_number</span><span class="plain">;</span>
<span class="identifier">K_array</span><span class="plain">[</span><span class="identifier">pc</span><span class="plain">++] = </span><span class="identifier">OK</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Kinds::function_kind</span><span class="plain">(</span><span class="identifier">pc</span><span class="plain">, </span><span class="identifier">K_array</span><span class="plain">, </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">kind_returned</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP47"></a><b>&#167;47. </b>Finally, I6 local variable declarations for the temporary values we will
need in the compilation of any given routine:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::declare<button class="popup" onclick="togglePopup('usagePopup1916')">...<span class="popuptext" id="usagePopup1916">Usage of <b>LocalVariables::declare</b>:<br>Routines - <a href="26-rt.html#SP3">&#167;3</a>, <a href="26-rt.html#SP4">&#167;4</a>, <a href="26-rt.html#SP4_1_1">&#167;4.1.1</a></span></button></span><span class="plain">(</span><span class="reserved">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">shell_mode</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">purpose</span><span class="plain">, </span><span class="identifier">from</span><span class="plain"> = </span><span class="constant">TOKEN_CALL_PARAMETER_LV</span><span class="plain">, </span><span class="identifier">to</span><span class="plain"> = </span><span class="constant">INTERNAL_USE_LV</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shell_mode</span><span class="plain">) </span><span class="identifier">to</span><span class="plain"> = </span><span class="constant">OTHER_CALL_PARAMETER_LV</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">)</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">purpose</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">; </span><span class="identifier">purpose</span><span class="plain"> &lt;= </span><span class="identifier">to</span><span class="plain">; </span><span class="identifier">purpose</span><span class="plain">++) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">-&gt;</span><span class="element">local_value_variables</span><span class="plain">.</span><span class="element">local_variable_allocation</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain">; </span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">next</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">lv_purpose</span><span class="plain"> == </span><span class="identifier">purpose</span><span class="plain">) {</span>
<span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">shell_mode</span><span class="plain">, </span><span class="constant">4</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">LocalVariables::declare_this<button class="popup" onclick="togglePopup('usagePopup1917')">...<span class="popuptext" id="usagePopup1917">Usage of <b>LocalVariables::declare_this</b>:<br><a href="24-lv.html#SP8">&#167;8</a>, <a href="24-lv.html#SP10">&#167;10</a>, <a href="24-lv.html#SP11">&#167;11</a>, <a href="24-lv.html#SP27">&#167;27</a>, <a href="24-lv.html#SP28">&#167;28</a>, <a href="24-lv.html#SP29">&#167;29</a>, <a href="24-lv.html#SP41">&#167;41</a>, <a href="24-lv.html#SP43">&#167;43</a>, <a href="24-lv.html#SP45">&#167;45</a>, Adjective Meanings - <a href="4-am.html#SP33_2">&#167;33.2</a><br>Terms - <a href="11-tr.html#SP10">&#167;10</a><br>Deciding to Defer - <a href="12-dtd.html#SP9">&#167;9</a>, <a href="12-dtd.html#SP23">&#167;23</a>, <a href="12-dtd.html#SP25">&#167;25</a>, <a href="12-dtd.html#SP26">&#167;26</a>, <a href="12-dtd.html#SP27">&#167;27</a><br>Cinders and Deferrals - <a href="12-cad.html#SP7">&#167;7</a><br>Runtime Support for Kinds - <a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">&#167;24.6.4</a><br>Lvalues - <a href="14-lv.html#SP14_1">&#167;14.1</a>, <a href="14-lv.html#SP14_5">&#167;14.5</a><br>Conditions - <a href="14-cn.html#SP16_3">&#167;16.3</a><br>Equations - <a href="20-eq.html#SP48">&#167;48</a><br>Compile Invocations Inline - <a href="25-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="25-cii.html#SP3_5_1">&#167;3.5.1</a>, <a href="25-cii.html#SP3_5_3">&#167;3.5.3</a><br>Compile Phrases - <a href="25-cp.html#SP5_3_5">&#167;5.3.5</a></span></button></span><span class="plain">(</span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">shell_mode</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">reason</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Produce::local_exists</span><span class="plain">(</span><span class="functiontext"><a href="27-em.html#SP2">Emit::tree</a></span><span class="plain">(), </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">annot</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_purpose</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TOKEN_CALL_PARAMETER_LV:</span><span class="plain"> </span><span class="identifier">annot</span><span class="plain"> = </span><span class="identifier">CALL_PARAMETER_IANN</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="identifier">OTHER_CALL_PARAMETER_LV:</span><span class="plain"> </span><span class="identifier">annot</span><span class="plain"> = </span><span class="identifier">IMPLIED_CALL_PARAMETER_IANN</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">);</span>
<span class="functiontext"><a href="24-lv.html#SP48">LocalVariables::comment_on</a></span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_purpose</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="functiontext"><a href="27-em.html#SP3">Emit::local</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">kind_as_declared</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">lv_lvalue</span><span class="plain">, </span><span class="identifier">annot</span><span class="plain">, </span><span class="identifier">comment</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">symb</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">LocalVariables::create_and_declare<button class="popup" onclick="togglePopup('usagePopup1918')">...<span class="popuptext" id="usagePopup1918">Usage of <b>LocalVariables::create_and_declare</b>:<br>Runtime Support for Kinds - <a href="13-rsfk.html#SP24_4_1">&#167;24.4.1</a>, <a href="13-rsfk.html#SP24_4_2">&#167;24.4.2</a></span></button></span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="functiontext"><a href="24-lv.html#SP11">LocalVariables::add_named_call</a></span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="functiontext"><a href="24-lv.html#SP38">LocalVariables::set_kind</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="24-lv.html#SP47">LocalVariables::declare_this</a></span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">5</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP48"></a><b>&#167;48. </b>Note that a deallocated "let" variable retains its most recent name.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LocalVariables::comment_on<button class="popup" onclick="togglePopup('usagePopup1919')">...<span class="popuptext" id="usagePopup1919">Usage of <b>LocalVariables::comment_on</b>:<br><a href="24-lv.html#SP47">&#167;47</a></span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">purpose</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">purpose</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TOKEN_CALL_PARAMETER_LV:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">))</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"'%+W': "</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">);</span>
<span class="identifier">Kinds::Textual::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">kind_as_declared</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="identifier">OTHER_CALL_PARAMETER_LV:</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LET_VALUE_LV:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">))</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"e.g., '%+W'"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">varname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">allocated</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">": "</span><span class="plain">);</span>
<span class="identifier">Kinds::Textual::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">kind_as_declared</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (deallocated by end of phrase)"</span><span class="plain">);</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="identifier">INTERNAL_USE_LV:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="identifier">comment_on_use</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s"</span><span class="plain">, </span><span class="identifier">lvar</span><span class="plain">-&gt;</span><span class="element">comment_on_use</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"internal use only"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 24: Compilation Context.)</i></li><li><a href="24-pb.html">Continue with 'Phrase Blocks'</a></li></ul><hr class="tocbar">
<!--End of weave-->
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
</main>
</body>
</html>