1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 00:24:22 +03:00
inform7/docs/imperative-module/2-sv.html

309 lines
44 KiB
HTML
Raw Normal View History

2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2021-04-02 02:47:20 +03:00
<title>Shared Variables</title>
2020-05-03 03:20:55 +03:00
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2019-03-17 14:40:57 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-05-03 03:01:21 +03:00
2020-05-03 03:20:55 +03:00
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-05-03 03:01:21 +03:00
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
2020-05-03 03:20:55 +03:00
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-04-14 19:56:54 +03:00
2019-03-17 14:40:57 +02:00
</head>
2020-05-03 03:01:21 +03:00
<body class="commentary-font">
2020-03-19 02:11:25 +02:00
<nav role="navigation">
2020-04-14 19:56:54 +03:00
<h1><a href="../index.html">
2020-05-03 18:34:53 +03:00
<img src="../docs-assets/Inform.png" height=72">
2020-04-14 19:56:54 +03:00
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
</ul><h2>Compiler Webs</h2><ul>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
2020-08-26 12:52:50 +03:00
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../assertions-module/index.html">assertions</a></li>
<li><a href="../values-module/index.html">values</a></li>
2021-02-07 14:44:02 +02:00
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="index.html"><span class="selectedlink">imperative</span></a></li>
2020-08-26 12:52:50 +03:00
<li><a href="../runtime-module/index.html">runtime</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
2020-05-20 02:02:28 +03:00
</ul><h2>Services</h2><ul>
2020-04-14 19:56:54 +03:00
<li><a href="../arch-module/index.html">arch</a></li>
2020-08-20 01:36:18 +03:00
<li><a href="../calculus-module/index.html">calculus</a></li>
2020-04-14 19:56:54 +03:00
<li><a href="../html-module/index.html">html</a></li>
2020-05-20 02:02:28 +03:00
<li><a href="../inflections-module/index.html">inflections</a></li>
2020-08-20 01:36:18 +03:00
<li><a href="../kinds-module/index.html">kinds</a></li>
2020-05-20 02:02:28 +03:00
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
2020-08-20 01:36:18 +03:00
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
2020-04-14 19:56:54 +03:00
</ul>
2020-03-19 02:11:25 +02:00
</nav>
<main role="main">
2021-04-02 02:47:20 +03:00
<!--Weave of 'Shared Variables' generated by Inweb-->
2020-05-03 03:01:21 +03:00
<div class="breadcrumbs">
2021-04-02 02:47:20 +03:00
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">imperative</a></li><li><a href="index.html#2">Chapter 2: Compilation Context</a></li><li><b>Shared Variables</b></li></ul></div>
<p class="purpose">Shared variables are held in common by all rules in a given rulebook.</p>
2019-03-17 14:40:57 +02:00
2021-04-02 02:47:20 +03:00
<ul class="toc"><li><a href="2-sv.html#SP1">&#167;1. Introduction</a></li><li><a href="2-sv.html#SP2">&#167;2. Variables</a></li><li><a href="2-sv.html#SP6">&#167;6. Sets</a></li><li><a href="2-sv.html#SP9">&#167;9. Access lists</a></li></ul><hr class="tocbar">
2019-03-17 14:40:57 +02:00
2021-04-02 02:47:20 +03:00
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Introduction. </b>Inform allows some variables to be shared by a number of different rules
(with different stack frames) and yet not be global in scope or permanent
in existence: they are shared by some process carried out by rulebooks.
</p>
<p class="commentary">The semantics of shared variables are unusual because rules can be
in multiple rulebooks, or can be moved out of their expected rulebooks.
Their names are therefore not limited in scope &mdash; they are global, and
they belong to the same namespace as global variables. But access to them
is restricted to just those rules with permission.
</p>
<p class="commentary">Each <a href="2-sv.html#SP2" class="internal">shared_variable</a> belongs to just one <a href="2-sv.html#SP6" class="internal">shared_variable_set</a>, but the
code forming the body of a rule may be able to access multiple sets. So
each stack frame has its own <a href="2-sv.html#SP9" class="internal">shared_variable_access_list</a> of those sets
which it can see.
</p>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Variables. </b>As can be seen, a shared variable is really just some additional expectations
placed on a global variable:
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owner</span><span class="plain-syntax">; </span><span class="comment-syntax"> who owns this</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax">; </span><span class="comment-syntax"> text of the name</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">assigned_at</span><span class="plain-syntax">; </span><span class="comment-syntax"> sentence assigning it</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">underlying_var</span><span class="plain-syntax">; </span><span class="comment-syntax"> the variable in question</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">offset_in_owning_frame</span><span class="plain-syntax">; </span><span class="comment-syntax"> word offset of storage (counts from 0)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">match_wording_text</span><span class="plain-syntax">; </span><span class="comment-syntax"> matching text (relevant for action variables only)</span>
2020-05-09 15:07:39 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
2021-04-02 02:47:20 +03:00
<span class="plain-syntax">} </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">;</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-04-02 02:47:20 +03:00
<ul class="endnotetexts"><li>The structure shared_variable is accessed in 4/cii, 4/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>And it can only be created within a set:
</p>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::new</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Articles::remove_the</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax"> = </span><span class="identifier-syntax">set</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_in_owning_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">assigned_at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NonlocalVariables::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">shv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">underlying_var</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nlv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTVariables::set_I6_identifier</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">RTVariables::shv_rvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTVariables::set_I6_identifier</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="identifier-syntax">RTVariables::shv_lvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-sv.html#SP6" class="function-link"><span class="function-syntax">SharedVariables::add_to_set</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-04-02 02:47:20 +03:00
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>Some miscellaneous access functions:
</p>
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::get_owner_id</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owner</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">recognition_id</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::get_offset</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">offset_in_owning_frame</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::get_kind</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nlv</span><span class="plain-syntax"> = </span><a href="2-sv.html#SP4" class="function-link"><span class="function-syntax">SharedVariables::get_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">);</span>
2021-02-07 14:44:02 +02:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NonlocalVariables::kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">nlv</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
<span class="identifier-syntax">nonlocal_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::get_variable</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">shv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">underlying_var</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>The match text associated with a shared variable is used in parsing action
patterns: see <a href="../if-module/4-anl.html" class="internal">Action Name Lists (in if)</a>. But for most shared variables, this
text remains empty.
</p>
2020-05-03 03:01:21 +03:00
2021-04-02 02:47:20 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::set_matching_text</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::get_matching_text</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Sets. </b>Sets are identified at run-time by an ID number, the "recognition ID", which
must be unique to that set and also small enough to be stored in what might
only be a 16-bit unsigned integer.
</p>
2020-05-03 03:01:21 +03:00
2021-04-02 02:47:20 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">recognition_id</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">creator_fn_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">shared_variable</span></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::new_set</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">);</span>
2021-04-01 01:28:26 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">recognition_id</span><span class="plain-syntax"> = </span><span class="identifier-syntax">id</span><span class="plain-syntax">;</span>
2021-04-02 02:47:20 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">);</span>
2021-04-01 01:28:26 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">creator_fn_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::set_empty</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">size_of_largest_set</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::add_to_set</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">SharedVariables::add_to_set</span></span>:<br/><a href="2-sv.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">) &gt; </span><span class="identifier-syntax">size_of_largest_set</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">size_of_largest_set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::size_of_largest_set</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">size_of_largest_set</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
</pre>
<ul class="endnotetexts"><li>The structure shared_variable_set is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>The creator function claims memory to store these variables, and initialises
them, at runtime. Other parts of Inform creating sets are expected to set this
function name (and thus specify where in the Inter hierarchy it will go), and
also to call <span class="extract"><span class="extract-syntax">RTVariables::compile_frame_creator</span></span>.
</p>
2020-05-03 03:01:21 +03:00
2021-04-02 02:47:20 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::set_frame_creator</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">creator_fn_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">iname</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::frame_creator</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">creator_fn_iname</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>Returns the first variable in the set whose matching text begins <span class="extract"><span class="extract-syntax">W</span></span>. Note
that this requires the match text to be nonempty, so it can only return
variables which have one.
</p>
2020-05-03 03:01:21 +03:00
2021-04-02 02:47:20 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::parse_match_clause</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">,</span>
2021-04-01 01:28:26 +03:00
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
2021-04-02 02:47:20 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::starts_with</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_wording_text</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
2021-04-02 02:47:20 +03:00
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Access lists. </b>These could hardly be simpler:
</p>
2020-05-03 03:01:21 +03:00
2021-04-02 02:47:20 +03:00
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sets</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">shared_variable_set</span></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::new_access_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nshvol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nshvol</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">nshvol</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-04-02 02:47:20 +03:00
<ul class="endnotetexts"><li>The structure shared_variable_access_list is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>Duplicates are not allowed:
2020-05-03 03:01:21 +03:00
</p>
<pre class="displayed-code all-displayed-code code-font">
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::add_set_to_access_list</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">SharedVariables::add_set_to_access_list</span></span>:<br/><a href="2-sv.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">access</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">existing</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">access</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">existing</span><span class="plain-syntax"> == </span><span class="identifier-syntax">set</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">access</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">);</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax"> }</span>
2021-04-02 02:47:20 +03:00
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-04-02 02:47:20 +03:00
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>This changes <span class="extract"><span class="extract-syntax">access</span></span> to the union of <span class="extract"><span class="extract-syntax">access</span></span> and <span class="extract"><span class="extract-syntax">extras</span></span>:
2020-05-03 03:01:21 +03:00
</p>
<pre class="displayed-code all-displayed-code code-font">
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SharedVariables::append_access_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">extras</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">extras</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">access</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">extras</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-sv.html#SP10" class="function-link"><span class="function-syntax">SharedVariables::add_set_to_access_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">access</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2021-04-02 02:47:20 +03:00
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b>Returns the first shared variable of the given name <span class="extract"><span class="extract-syntax">W</span></span> in any set in the
access list. This would be inefficient if access lists were ever large, or
if individual sets were, but they are not. Giving each access list its own
associative hash would make little or no saving of time, and would decrease
the predictability of results.
</p>
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
<pre class="displayed-code all-displayed-code code-font">
2021-04-02 02:47:20 +03:00
<span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="function-syntax">SharedVariables::parse_from_access_list</span><span class="plain-syntax">(</span><span class="reserved-syntax">shared_variable_access_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">access</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Articles::remove_the</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax"> *</span><span class="identifier-syntax">set</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">access</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable_set</span><span class="plain-syntax">, </span><span class="identifier-syntax">access</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sets</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">, </span><span class="reserved-syntax">shared_variable</span><span class="plain-syntax">, </span><span class="identifier-syntax">set</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">shv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">shv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
2020-05-03 03:01:21 +03:00
<span class="plain-syntax">}</span>
2019-03-17 14:40:57 +02:00
</pre>
2020-05-03 03:01:21 +03:00
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-lv.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-lv.html">lv</a></li><li class="progresscurrent">sv</li><li class="progresssection"><a href="2-pb.html">pb</a></li><li class="progresssection"><a href="2-sf.html">sf</a></li><li class="progresssection"><a href="2-chr.html">chr</a></li><li class="progresschapter"><a href="3-cfs.html">3</a></li><li class="progresschapter"><a href="4-inv.html">4</a></li><li class="progressnext"><a href="2-pb.html">&#10095;</a></li></ul></div>
2020-05-03 03:01:21 +03:00
</nav><!--End of weave-->
2019-03-17 14:40:57 +02:00
2020-03-19 02:11:25 +02:00
</main>
2019-03-17 14:40:57 +02:00
</body>
</html>