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

Refactored arch module to provide new -format notation

This commit is contained in:
Graham Nelson 2021-09-11 14:36:26 +01:00
parent 0fabb281a6
commit cc4287a9e7
39 changed files with 3736 additions and 3793 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
v10.1.0-alpha.1+6T21 'Krypton' (10 September 2021)
v10.1.0-alpha.1+6T22 'Krypton' (11 September 2021)
## About Inform 7

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 10 September 2021
Build Number: 6T21
Build Date: 11 September 2021
Build Number: 6T22

View file

@ -90,7 +90,7 @@ which use this module:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ArchModule::start</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-arc.html#SP3" class="function-link"><span class="function-syntax">Architectures::create</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP3" class="function-link"><span class="function-syntax">TargetVMs::create</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP1" class="function-link"><span class="function-syntax">TargetVMs::create</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ArchModule::end</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>

View file

@ -145,12 +145,12 @@ leafnames:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">Architectures::to_codename</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Architectures::to_codename</span></span>:<br/>Target Virtual Machines - <a href="2-tvm.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">Architectures::to_codename</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Architectures::to_codename</span></span>:<br/>Target Virtual Machines - <a href="2-tvm.html#SP3">&#167;3</a>, <a href="2-tvm.html#SP6_4">&#167;6.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">A</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">A</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">shorthand</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="function-syntax">Architectures::from_codename</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Architectures::from_codename</span></span>:<br/>Target Virtual Machines - <a href="2-tvm.html#SP3">&#167;3</a>, <a href="2-tvm.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="function-syntax">Architectures::from_codename</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Architectures::from_codename</span></span>:<br/>Target Virtual Machines - <a href="2-tvm.html#SP1">&#167;1</a>, <a href="2-tvm.html#SP6_1_1">&#167;6.1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">shorthand</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">))</span>
@ -162,11 +162,11 @@ leafnames:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Architectures::is_16_bit</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Architectures::is_16_bit</span></span>:<br/>Target Virtual Machines - <a href="2-tvm.html#SP2">&#167;2</a>, <a href="2-tvm.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Architectures::is_16_bit</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Architectures::is_16_bit</span></span>:<br/>Target Virtual Machines - <a href="2-tvm.html#SP3">&#167;3</a>, <a href="2-tvm.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">A</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no arch"</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">A</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sixteen_bit</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Architectures::debug_enabled</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Architectures::debug_enabled</span></span>:<br/>Target Virtual Machines - <a href="2-tvm.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Architectures::debug_enabled</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Architectures::debug_enabled</span></span>:<br/>Target Virtual Machines - <a href="2-tvm.html#SP6">&#167;6</a>, <a href="2-tvm.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">A</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no arch"</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">A</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">debug_enabled</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>

View file

@ -144,7 +144,7 @@ better, if available.
<span class="plain-syntax"> </span><span class="identifier-syntax">n</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">n</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">1</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">n</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">x</span><span class="plain-syntax">)) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">", "</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">n</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">1</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">n</span><span class="plain-syntax"> == </span><span class="identifier-syntax">x</span><span class="plain-syntax">)) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" or "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP4" class="function-link"><span class="function-syntax">TargetVMs::write</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP5" class="function-link"><span class="function-syntax">TargetVMs::write</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
@ -405,7 +405,7 @@ according to what the <span class="extract"><span class="extract-syntax">token</
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</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">seen</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">cps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">current_family</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-tvm.html#SP13" class="function-link"><span class="function-syntax">TargetVMs::compatible_with</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">cps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">current_family</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">seen</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">VersionNumbers::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">version</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">with</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">) || (</span><a href="2-tvm.html#SP9" class="function-link"><span class="function-syntax">TargetVMs::debug_enabled</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">) == </span><span class="identifier-syntax">with</span><span class="plain-syntax">)))</span>
@ -436,7 +436,7 @@ according to what the <span class="extract"><span class="extract-syntax">token</
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">seen</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">token</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-tvm.html#SP13" class="function-link"><span class="function-syntax">TargetVMs::compatible_with</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">token</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">seen</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-tvm.html#SP9" class="function-link"><span class="function-syntax">TargetVMs::debug_enabled</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">) == </span><span class="identifier-syntax">with</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-cmp.html#SP4" class="function-link"><span class="function-syntax">Compatibility::add_exception</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">);</span>
@ -452,8 +452,8 @@ according to what the <span class="extract"><span class="extract-syntax">token</
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">token</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">cps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">current_family</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_name</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-tvm.html#SP13" class="function-link"><span class="function-syntax">TargetVMs::compatible_with</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">token</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">cps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">current_family</span><span class="plain-syntax"> = </span><a href="2-tvm.html#SP13" class="function-link"><span class="function-syntax">TargetVMs::family</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -466,7 +466,7 @@ according to what the <span class="extract"><span class="extract-syntax">token</
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">cps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_used</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">cps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">current_family</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">cps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">current_family</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_name</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-tvm.html#SP13" class="function-link"><span class="function-syntax">TargetVMs::compatible_with</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">cps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">current_family</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-cmp.html#SP4" class="function-link"><span class="function-syntax">Compatibility::add_exception</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</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">TRUE</span><span class="plain-syntax">;</span>

View file

@ -73,218 +73,316 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#2">Chapter 2: Architectures and VMs</a></li><li><b>Target Virtual Machines</b></li></ul></div>
<p class="purpose">To deal with multiple object code formats.</p>
<ul class="toc"><li><a href="2-tvm.html#SP1">&#167;1. Object code</a></li><li><a href="2-tvm.html#SP3">&#167;3. Standard set</a></li><li><a href="2-tvm.html#SP4">&#167;4. Describing and finding</a></li><li><a href="2-tvm.html#SP9">&#167;9. Miscellaneous provisions</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="2-tvm.html#SP1">&#167;1. Target VMs</a></li><li><a href="2-tvm.html#SP5">&#167;5. To and from text</a></li><li><a href="2-tvm.html#SP9">&#167;9. Architectural provisions</a></li><li><a href="2-tvm.html#SP10">&#167;10. File extension provisions</a></li><li><a href="2-tvm.html#SP13">&#167;13. Family compatibility</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Object code. </b>The end result of compilation is traditionally called "object code" and
people tend to use words like "binary" or even "machine code" about it,
though in fact the world is more diverse nowadays. Inform 7 has always
generated "object code" which is itself a program for a virtual machine;
for example, it makes Glulx bytecode rather than x86 or ARM instructions.
Because of that, we use the customary term "virtual machine" for the format
of the end product of the Inform build process. But it doesn't have to be
virtual. If Inter-to-x86-via-C is properly implemented, we will probably
want to add a VM to represent something like "32-bit binary via ANSI C".
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Target VMs. </b>For a fuller explanation of these, see <a href="P-wtmd.html" class="internal">What This Module Does</a>, but briefly:
a <a href="2-tvm.html#SP2" class="internal">target_vm</a> object represents a choice of both Inter architecture and
also a format for final code-generation from Inter. For example, it might
represent "16-bit with debugging enabled to be generated to Inform 6 code",
or, say, "32-bit to be generated to ANSI C code".
</p>
<p class="commentary">Each different target VM is represented by one of these objects:
<p class="commentary">The basic set of possible target VMs is made when the <a href="index.html" class="internal">arch</a> module starts up:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::create</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">TargetVMs::create</span></span>:<br/>Arch Module - <a href="1-am.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> hat tip: Joel Berez and Marc Blank, 1979, and later hands</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP3" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"16"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"5"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"z5"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zblorb"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Parchment"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP3" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"16d"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"5"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"z5"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zblorb"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Parchment"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP3" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"16"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"8"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"z8"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zblorb"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Parchment"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP3" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"16d"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"8"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"z8"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zblorb"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Parchment"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> hat tip: Andrew Plotkin, 2000</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP3" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"32"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"3.1.2"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"ulx"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"gblorb"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Quixe"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP3" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"32d"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"3.1.2"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"ulx"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"gblorb"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Quixe"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> C support added September 2021</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP3" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"32"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"C"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"1"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"c"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">""</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">""</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP3" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"32d"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"C"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"1"</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"c"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">""</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">""</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The <a href="2-tvm.html#SP2" class="internal">target_vm</a> structure contains two arguably architectural doohickies:
potential limits on the use of floating-point arithmetic or on local variables.
These are indeed currently derived only from the choice of <span class="extract"><span class="extract-syntax">architecture</span></span>, but
we're keeping them here in case there is some day a need for a 32-bit format
with integer-only arithmetic, say.
</p>
<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">target_vm</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">family_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> such as </span><span class="extract"><span class="extract-syntax">Glulx</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">with_debugging_enabled</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">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">architecture</span><span class="plain-syntax">; </span><span class="comment-syntax"> such as 32d</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">semantic_version_number</span><span class="plain-syntax"> </span><span class="identifier-syntax">version</span><span class="plain-syntax">; </span><span class="comment-syntax"> such as 0.8.7</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM_extension</span><span class="plain-syntax">; </span><span class="comment-syntax"> canonical filename extension</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM_unblorbed_extension</span><span class="plain-syntax">; </span><span class="comment-syntax"> such as </span><span class="extract"><span class="extract-syntax">z8</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM_blorbed_extension</span><span class="plain-syntax">; </span><span class="comment-syntax"> when blorbed up</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM_image</span><span class="plain-syntax">; </span><span class="comment-syntax"> filename of image for icon denoting VM</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">max_locals</span><span class="plain-syntax">; </span><span class="comment-syntax"> upper limit on local variables per stack frame</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM_image</span><span class="plain-syntax">; </span><span class="comment-syntax"> filename of image for icon used in the index</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">default_browser_interpreter</span><span class="plain-syntax">; </span><span class="comment-syntax"> e.g., "Parchment"</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iFiction_format_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> e.g., "zcode": see the Treaty of Babel</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">format_name</span><span class="plain-syntax">; </span><span class="comment-syntax"> transpiler format, e.g., "Inform6" or "C"</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">format_options</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">text_stream</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">transpiler_family</span><span class="plain-syntax">; </span><span class="comment-syntax"> transpiler format, e.g., "Inform6" or "C"</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">full_format</span><span class="plain-syntax">; </span><span class="comment-syntax"> e.g., "Inform6/32d/v3.1.2"</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">supports_floating_point</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">max_locals</span><span class="plain-syntax">; </span><span class="comment-syntax"> upper limit on local variables per stack frame</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">format_options</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">text_stream</span></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure target_vm is accessed in 2/cmp and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::new</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">TargetVMs::new</span></span>:<br/><a href="2-tvm.html#SP3">&#167;3</a>, <a href="2-tvm.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">code</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nick</span><span class="plain-syntax">, </span><span class="identifier-syntax">semantic_version_number</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">image</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">interpreter</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">blorbed</span><span class="plain-syntax">, </span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arch</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">debug</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">max_locals</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iFiction</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">format</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::new</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">TargetVMs::new</span></span>:<br/><a href="2-tvm.html#SP1">&#167;1</a>, <a href="2-tvm.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arch</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">format</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">semantic_version_number</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">unblorbed</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">blorbed</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">interpreter</span><span class="plain-syntax">, </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">opts</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">code</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">version</span><span class="plain-syntax"> = </span><span class="identifier-syntax">V</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_extension</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">nick</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_unblorbed_extension</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">nick</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_unblorbed_extension</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">unblorbed</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_blorbed_extension</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">blorbed</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_image</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">image</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">max_locals</span><span class="plain-syntax"> = </span><span class="identifier-syntax">max_locals</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">default_browser_interpreter</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">interpreter</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax"> = </span><span class="identifier-syntax">arch</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">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no such architecture"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">with_debugging_enabled</span><span class="plain-syntax"> = </span><span class="identifier-syntax">debug</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">supports_floating_point</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-arc.html#SP6" class="function-link"><span class="function-syntax">Architectures::is_16_bit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax">)) </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">supports_floating_point</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">iFiction_format_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">iFiction</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">format_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">format</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-arc.html#SP6" class="function-link"><span class="function-syntax">Architectures::is_16_bit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">supports_floating_point</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">max_locals</span><span class="plain-syntax"> = </span><span class="constant-syntax">15</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">unblorbed</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"z5"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_image</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"vm_z8.png"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_image</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"vm_z5.png"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">supports_floating_point</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">max_locals</span><span class="plain-syntax"> = </span><span class="constant-syntax">256</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_image</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"vm_glulx.png"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">iFiction_format_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">format</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-arc.html#SP6" class="function-link"><span class="function-syntax">Architectures::is_16_bit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">iFiction_format_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"zcode"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">iFiction_format_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"glulx"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">iFiction_format_name</span><span class="plain-syntax">, </span><span class="string-syntax">"Inform+%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">format</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">transpiler_family</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">format</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">format_options</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">full_format</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">full_format</span><span class="plain-syntax">, </span><span class="string-syntax">"%S/%S/v%v"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">transpiler_family</span><span class="plain-syntax">, </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::to_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax">), &amp;</span><span class="identifier-syntax">V</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">opts</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">opt</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">opt</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax">, </span><span class="identifier-syntax">opts</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">full_format</span><span class="plain-syntax">, </span><span class="string-syntax">"/%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">opt</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">opt</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">format_options</span><span class="plain-syntax">);</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">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Standard set. </b>This is called when the <a href="index.html" class="internal">arch</a> module starts up; no other architectures
are ever made.
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>Plumbing is included here to add "options" to a VM's textual description. The
idea is that these allow for the user to specify additional and VM-specific
command-line options (using <span class="extract"><span class="extract-syntax">-format</span></span>) which are then picked up by <a href="../final-module/index.html" class="internal">final</a>.
Thus, a request for <span class="extract"><span class="extract-syntax">-format=C/32d/no-halt/stack=240</span></span> would cause a new variant of
<span class="extract"><span class="extract-syntax">C/32d</span></span> to be created which would have the (purely hypothetical) list of
options <span class="extract"><span class="extract-syntax">I"no-halt", I"stack=240"</span></span>. It is then up to the C final code generator
to understand what these mean, if indeed they mean anything.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::create</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">TargetVMs::create</span></span>:<br/>Arch Module - <a href="1-am.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> hat tip: Joel Berez and Marc Blank, 1979, and later hands</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP2" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Z-Machine"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"z5"</span><span class="plain-syntax">, </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"5"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"vm_z5.png"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Parchment"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zblorb"</span><span class="plain-syntax">, </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"16"</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">15</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zcode"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP2" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Z-Machine"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"z5"</span><span class="plain-syntax">, </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"5"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"vm_z5.png"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Parchment"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zblorb"</span><span class="plain-syntax">, </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"16d"</span><span class="plain-syntax">), </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="constant-syntax">15</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zcode"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP2" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Z-Machine"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"z8"</span><span class="plain-syntax">, </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"8"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"vm_z8.png"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Parchment"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zblorb"</span><span class="plain-syntax">, </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"16"</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">15</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zcode"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP2" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Z-Machine"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"z8"</span><span class="plain-syntax">, </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"8"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"vm_z8.png"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Parchment"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zblorb"</span><span class="plain-syntax">, </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"16d"</span><span class="plain-syntax">), </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="constant-syntax">15</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"zcode"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> hat tip: Andrew Plotkin, 2000</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP2" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Glulx"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ulx"</span><span class="plain-syntax">, </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"3.1.2"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"vm_glulx.png"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Quixe"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"gblorb"</span><span class="plain-syntax">, </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"32"</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">256</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"glulx"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP2" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Glulx"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ulx"</span><span class="plain-syntax">, </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"3.1.2"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"vm_glulx.png"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Quixe"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"gblorb"</span><span class="plain-syntax">, </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"32d"</span><span class="plain-syntax">), </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="constant-syntax">256</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"glulx"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP2" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"C"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"c"</span><span class="plain-syntax">, </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"1"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"vm_glulx.png"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">""</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">""</span><span class="plain-syntax">, </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"32"</span><span class="plain-syntax">), </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">256</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"inform7-c"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"C"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvm.html#SP2" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"C"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"c"</span><span class="plain-syntax">, </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"1"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"vm_glulx.png"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">""</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">""</span><span class="plain-syntax">, </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"32d"</span><span class="plain-syntax">), </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="constant-syntax">256</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"inform7-c"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"C"</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::new_variant</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::new_variant</span></span>:<br/><a href="2-tvm.html#SP6_3">&#167;6.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">opts</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-tvm.html#SP3" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">existing</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax">, </span><span class="identifier-syntax">existing</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">transpiler_family</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">existing</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">version</span><span class="plain-syntax">, </span><span class="identifier-syntax">existing</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_unblorbed_extension</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">existing</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_blorbed_extension</span><span class="plain-syntax">, </span><span class="identifier-syntax">existing</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">default_browser_interpreter</span><span class="plain-syntax">, </span><span class="identifier-syntax">opts</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Describing and finding. </b>This is the longhand form of the VM name:
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. To and from text. </b>First, writing. This is the longhand form of the VM name:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::write</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::write</span></span>:<br/>Compatibility - <a href="2-cmp.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::write</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::write</span></span>:<br/>Compatibility - <a href="2-cmp.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</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">VM</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"none"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">semantic_version_number</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">version</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">VersionNumbers::is_null</span><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" version %v"</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">V</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">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">with_debugging_enabled</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" with debugging"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">full_format</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::get_full_format_text</span><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</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">VM</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no VM"</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">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">full_format</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>Here we deduce a VM from the given filename extension, which is the rather
clumsy way that VMs are referred to on the <a href="../inform7/index.html" class="internal">inform7</a> command line. For
example, <span class="extract"><span class="extract-syntax">ulx</span></span> produces one of the Glulx VMs.
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>And now for reading. The following is used by <a href="../inbuild/index.html" class="internal">inbuild</a> when reading the
command-line option <span class="extract"><span class="extract-syntax">-format=T</span></span>: the text <span class="extract"><span class="extract-syntax">T</span></span> is supplied as a parameter here.
</p>
<p class="commentary">Note however that it actually calls <a href="2-tvm.html#SP6" class="internal">TargetVMs::find_with_hint</a>. The <span class="extract"><span class="extract-syntax">debug</span></span>
hint, if set, says to make the architecture have debugging enabled or not according
to this hint: thus <span class="extract"><span class="extract-syntax">"C"</span></span> plus the hint <span class="extract"><span class="extract-syntax">FALSE</span></span> will return the VM <span class="extract"><span class="extract-syntax">C/32</span></span>, while
<span class="extract"><span class="extract-syntax">"C"</span></span> plus the hint <span class="extract"><span class="extract-syntax">TRUE</span></span> will return the VM <span class="extract"><span class="extract-syntax">C/32d</span></span>. The hint <span class="extract"><span class="extract-syntax">NOT_APPLICABLE</span></span>
is ignored; and the hint is also ignored if the supplied text already definitely
specifies debugging. Thus <span class="extract"><span class="extract-syntax">"C/32d"</span></span> plus hint <span class="extract"><span class="extract-syntax">FALSE</span></span> will return <span class="extract"><span class="extract-syntax">C/32d</span></span>.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">format</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-tvm.html#SP6" class="function-link"><span class="function-syntax">TargetVMs::find_with_hint</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">format</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">); </span><span class="comment-syntax"> i.e., no hint</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::find_with_hint</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">format</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">debug</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">format</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">format</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wanted_language</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">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wanted_arch</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">semantic_version_number</span><span class="plain-syntax"> </span><span class="identifier-syntax">wanted_version</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VersionNumbers::null</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wanted_opts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-tvm.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Parse the text supplied into these variables</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax">) &amp;&amp; (</span><a href="2-arc.html#SP6" class="function-link"><span class="function-syntax">Architectures::debug_enabled</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax">))) </span><span class="identifier-syntax">debug</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-tvm.html#SP6_2" class="named-paragraph-link"><span class="named-paragraph">Try to find a VM which is a perfect match</span><span class="named-paragraph-number">6.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-tvm.html#SP6_3" class="named-paragraph-link"><span class="named-paragraph">Try to find a VM which would be a match except for the options</span><span class="named-paragraph-number">6.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-tvm.html#SP6_4" class="named-paragraph-link"><span class="named-paragraph">Try to find a VM in the now-deprecated old notation</span><span class="named-paragraph-number">6.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>&#167;6.1. </b>Format text is a list of criteria divided by slashes:
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse the text supplied into these variables</span><span class="named-paragraph-number">6.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">format</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">) == </span><span class="character-syntax">'/'</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="2-tvm.html#SP6_1_1" class="named-paragraph-link"><span class="named-paragraph">Accept criterion</span><span class="named-paragraph-number">6.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">, </span><span class="identifier-syntax">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="2-tvm.html#SP6_1_1" class="named-paragraph-link"><span class="named-paragraph">Accept criterion</span><span class="named-paragraph-number">6.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">)</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-tvm.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_1_1" class="paragraph-anchor"></a><b>&#167;6.1.1. </b>The first criterion is the only compulsory one, and must be something like
<span class="extract"><span class="extract-syntax">Inform6</span></span> or <span class="extract"><span class="extract-syntax">C</span></span>. After that, any criterion in the form of an architecture code,
like <span class="extract"><span class="extract-syntax">32d</span></span>, is interpreted as such; and any criterion opening with <span class="extract"><span class="extract-syntax">v</span></span> plus a
digit is read as a semantic version number. If any criteria are left after all
that, they are considered options (see above).
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Accept criterion</span><span class="named-paragraph-number">6.1.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wanted_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">wanted_language</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arch</span><span class="plain-syntax"> = </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</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">arch</span><span class="plain-syntax">) </span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">arch</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (((</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">) == </span><span class="character-syntax">'v'</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">) == </span><span class="character-syntax">'V'</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Characters::isdigit</span><span class="plain-syntax">(</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">)))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_first_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wanted_version</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VersionNumbers::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">criterion</span><span class="plain-syntax">), </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax">, </span><span class="identifier-syntax">wanted_opts</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-tvm.html#SP6_1">&#167;6.1</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP6_2" class="paragraph-anchor"></a><b>&#167;6.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Try to find a VM which is a perfect match</span><span class="named-paragraph-number">6.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</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">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">transpiler_family</span><span class="plain-syntax">, </span><span class="identifier-syntax">wanted_language</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax"> == </span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">debug</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">) || (</span><a href="2-tvm.html#SP9" class="function-link"><span class="function-syntax">TargetVMs::debug_enabled</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">) == </span><span class="identifier-syntax">debug</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-tvm.html#SP7" class="function-link"><span class="function-syntax">TargetVMs::versions_match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">wanted_version</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-tvm.html#SP8" class="function-link"><span class="function-syntax">TargetVMs::options_match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">wanted_opts</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VM</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">result</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-tvm.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_3" class="paragraph-anchor"></a><b>&#167;6.3. </b>If we're given, say, <span class="extract"><span class="extract-syntax">C/32d/no-pointer-nonsense</span></span> and we can't find that exact
thing, but can find <span class="extract"><span class="extract-syntax">C/32d</span></span>, then we construct a variant of it which does have
the option <span class="extract"><span class="extract-syntax">no-pointer-nonsense</span></span> and return that.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Try to find a VM which would be a match except for the options</span><span class="named-paragraph-number">6.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</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">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">transpiler_family</span><span class="plain-syntax">, </span><span class="identifier-syntax">wanted_language</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax"> == </span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">debug</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">) || (</span><a href="2-tvm.html#SP9" class="function-link"><span class="function-syntax">TargetVMs::debug_enabled</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">) == </span><span class="identifier-syntax">debug</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-tvm.html#SP7" class="function-link"><span class="function-syntax">TargetVMs::versions_match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">wanted_version</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VM</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">result</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-tvm.html#SP4" class="function-link"><span class="function-syntax">TargetVMs::new_variant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">result</span><span class="plain-syntax">, </span><span class="identifier-syntax">wanted_opts</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-tvm.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_4" class="paragraph-anchor"></a><b>&#167;6.4. </b>If we get here, we've failed to make any match using the modern notation.
</p>
<p class="commentary">So next we try to deduce a VM from the given filename extension, which is the
clumsy way that VMs used to be referred to on the <a href="../inform7/index.html" class="internal">inform7</a> command line. For
example, <span class="extract"><span class="extract-syntax">-format=ulx</span></span> produces <span class="extract"><span class="extract-syntax">Inform6/32</span></span> or <span class="extract"><span class="extract-syntax">Inform6/32d</span></span> (depending on
the <span class="extract"><span class="extract-syntax">debug</span></span> hint).
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Try to find a VM in the now-deprecated old notation</span><span class="named-paragraph-number">6.4</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::find_by_extension</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::find_by_extension</span></span>:<br/><a href="2-tvm.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ext</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">debug</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">ext</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">ext</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"ulx"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">file_extension</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">file_extension</span><span class="plain-syntax">, </span><span class="identifier-syntax">ext</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">file_extension</span><span class="plain-syntax">, </span><span class="identifier-syntax">format</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">file_extension</span><span class="plain-syntax">) == </span><span class="character-syntax">'.'</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_first_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">file_extension</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">file_extension</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::put</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">Characters::tolower</span><span class="plain-syntax">(</span><span class="identifier-syntax">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_unblorbed_extension</span><span class="plain-syntax">, </span><span class="identifier-syntax">ext</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">with_debugging_enabled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">debug</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_unblorbed_extension</span><span class="plain-syntax">, </span><span class="identifier-syntax">file_extension</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-tvm.html#SP9" class="function-link"><span class="function-syntax">TargetVMs::debug_enabled</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">) == </span><span class="identifier-syntax">debug</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">file_extension</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">result</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>A somewhat sharper method finds specific versions: for example, it can pick
out version 5 rather than version 8 of the Z-machine. Note that the version
numbers must match exactly, and not simply be compatible according to semver
rules.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::find_in_family</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">family</span><span class="plain-syntax">, </span><span class="identifier-syntax">semantic_version_number</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</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">debug</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">family</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">VersionNumbers::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">version</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">debug</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">debug</span><span class="plain-syntax"> == </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">with_debugging_enabled</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">VM</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>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>And a device for discovering (or making) a target VM given a more general
format,
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">format</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">debug</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wanted</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">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wanted_arch</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">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">segs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">segment</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">format</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">) == </span><span class="character-syntax">'/'</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">segment</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="2-tvm.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Accept segment</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">segment</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">segment</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="2-tvm.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Accept segment</span><span class="named-paragraph-number">7.1</span></a></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">segment</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</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">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">format_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">wanted</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax"> == </span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">with_debugging_enabled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">debug</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-tvm.html#SP8" class="function-link"><span class="function-syntax">TargetVMs::options_match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">segs</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VM</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">result</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">format_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">wanted</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax"> == </span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">with_debugging_enabled</span><span class="plain-syntax"> == </span><span class="identifier-syntax">debug</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VM</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">result</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new_VM</span><span class="plain-syntax"> = </span><a href="2-tvm.html#SP2" class="function-link"><span class="function-syntax">TargetVMs::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">family_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_extension</span><span class="plain-syntax">, </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">version</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_image</span><span class="plain-syntax">, </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">default_browser_interpreter</span><span class="plain-syntax">, </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_blorbed_extension</span><span class="plain-syntax">, </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">with_debugging_enabled</span><span class="plain-syntax">, </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">max_locals</span><span class="plain-syntax">, </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">iFiction_format_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">format_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">format_options</span><span class="plain-syntax"> = </span><span class="identifier-syntax">segs</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">new_VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">STDOUT</span><span class="plain-syntax">, </span><span class="string-syntax">"(-format=%S is deprecated: try -format=%S/%S instead)\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">format</span><span class="plain-syntax">, </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">transpiler_family</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::to_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</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">result</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><a href="2-tvm.html#SP5" class="function-link"><span class="function-syntax">TargetVMs::find_by_extension</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">format</span><span class="plain-syntax">, </span><span class="identifier-syntax">debug</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">result</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">STDOUT</span><span class="plain-syntax">, </span><span class="string-syntax">"(warning: that use of -format is deprecated: try -format=%S/%S instead)\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">format_name</span><span class="plain-syntax">, </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::to_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">result</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</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">result</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Accept segment</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="2-tvm.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>Semantic version rules apply if the user supplies a format text with a given
version requirement. If the user asks for <span class="extract"><span class="extract-syntax">v3.1.0</span></span> and we've got <span class="extract"><span class="extract-syntax">v3.1.2</span></span>,
no problem: there's a match. But <span class="extract"><span class="extract-syntax">v2.9.3</span></span> or <span class="extract"><span class="extract-syntax">3.2.1</span></span> would not match.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wanted</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">wanted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">segment</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_architecture</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arch</span><span class="plain-syntax"> = </span><a href="2-arc.html#SP5" class="function-link"><span class="function-syntax">Architectures::from_codename</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">segment</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">arch</span><span class="plain-syntax">) </span><span class="identifier-syntax">wanted_arch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">arch</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">segment</span><span class="plain-syntax">), </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax">, </span><span class="identifier-syntax">segs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::versions_match</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::versions_match</span></span>:<br/><a href="2-tvm.html#SP6_2">&#167;6.2</a>, <a href="2-tvm.html#SP6_3">&#167;6.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">semantic_version_number</span><span class="plain-syntax"> </span><span class="identifier-syntax">wanted</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">VersionNumbers::is_null</span><span class="plain-syntax">(</span><span class="identifier-syntax">wanted</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">VersionNumberRanges::in_range</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">version</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VersionNumberRanges::compatibility_range</span><span class="plain-syntax">(</span><span class="identifier-syntax">wanted</span><span class="plain-syntax">))) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-tvm.html#SP7">&#167;7</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b></p>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>That just leaves how to tell whether or not a VM has exactly the right options,
given that (a) there can be any number of them, including 0, and (b) they can
be specified in any order. Speed is unimportant here: in effect we test whether
two lists of options give rise to sets which are subsets of each other.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::options_match</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::options_match</span></span>:<br/><a href="2-tvm.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::options_match</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::options_match</span></span>:<br/><a href="2-tvm.html#SP6_2">&#167;6.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="2-tvm.html#SP8" class="function-link"><span class="function-syntax">TargetVMs::ll_of_text_is_subset</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">supplied</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">format_options</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-tvm.html#SP8" class="function-link"><span class="function-syntax">TargetVMs::ll_of_text_is_subset</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">format_options</span><span class="plain-syntax">, </span><span class="identifier-syntax">supplied</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
@ -304,28 +402,24 @@ format,
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Miscellaneous provisions. </b></p>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Architectural provisions. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::is_16_bit</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::is_16_bit</span></span>:<br/>Compatibility - <a href="2-cmp.html#SP10_2">&#167;10.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::is_16_bit</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::is_16_bit</span></span>:<br/><a href="2-tvm.html#SP13">&#167;13</a><br/>Compatibility - <a href="2-cmp.html#SP10_2">&#167;10.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</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">VM</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no VM"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-arc.html#SP6" class="function-link"><span class="function-syntax">Architectures::is_16_bit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::debug_enabled</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::debug_enabled</span></span>:<br/>Compatibility - <a href="2-cmp.html#SP10_1">&#167;10.1</a>, <a href="2-cmp.html#SP10_2">&#167;10.2</a>, <a href="2-cmp.html#SP10_3">&#167;10.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::debug_enabled</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::debug_enabled</span></span>:<br/><a href="2-tvm.html#SP6_2">&#167;6.2</a>, <a href="2-tvm.html#SP6_3">&#167;6.3</a>, <a href="2-tvm.html#SP6_4">&#167;6.4</a><br/>Compatibility - <a href="2-cmp.html#SP10_1">&#167;10.1</a>, <a href="2-cmp.html#SP10_2">&#167;10.2</a>, <a href="2-cmp.html#SP10_3">&#167;10.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</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">VM</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no VM"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-arc.html#SP6" class="function-link"><span class="function-syntax">Architectures::debug_enabled</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::supports_floating_point</span><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</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">VM</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no VM"</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">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">supports_floating_point</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>The limits on local variables per routine are different on each platform.
On Z, the maximum is fixed at 15, but Glulx allows it to be set with an I6
memory setting.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::allow_this_many_locals</span><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</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">VM</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no VM"</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">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">max_locals</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">max_locals</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">N</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -337,12 +431,21 @@ memory setting.
<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>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>When releasing a blorbed story file, the file extension depends on the
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. File extension provisions. </b>The normal or unblorbed file extension is just a hint for what would make a
natural filename for our output: for example, <span class="extract"><span class="extract-syntax">py</span></span> would be a natural choice
for a Python VN, if there were one.
</p>
<p class="commentary">When releasing a blorbed story file, the file extension used depends on the
story file wrapped inside. (This is a dubious idea, in the opinion of
the author of Inform &mdash; should not "blorb" be one unified wrapper? &mdash; but
that ship seems to have sailed.)
</p>
<p class="commentary">Note that for VMs not using Inform 6, blorbing is essentially meaningless,
and then the blorbed extension may be the empty text.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::get_unblorbed_extension</span><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</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">VM</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no VM"</span><span class="plain-syntax">);</span>
@ -354,11 +457,16 @@ that ship seems to have sailed.)
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">VM_blorbed_extension</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b>This is the format name as expressed in an iFiction bibliographic record,
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>This is the format name as expressed in an iFiction bibliographic record,
where it's not meaningful to talk about debugging features or the number
of bits, and where it's currently not possible to express a VM version number.
</p>
<p class="commentary">It's also unclear what to write to this if we're compiling, say, an Inform 7
source text into C: the Treaty of Babel is unclear on that. For now, we write
<span class="extract"><span class="extract-syntax">Inform7+C</span></span>.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::get_iFiction_format</span><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</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">VM</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no VM"</span><span class="plain-syntax">);</span>
@ -370,9 +478,13 @@ of bits, and where it's currently not possible to express a VM version number.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">architecture</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. </b>Different VMs have different in-browser interpreters, which means that
Inblorb needs to be given different release instructions for them. If the
user doesn't specify any particular interpreter, she gets:
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b>Different VMs have different in-browser interpreters, which means that
<a href="../inblorb/index.html" class="internal">inblorb</a> needs to be given different release instructions for them. If the
user doesn't specify any particular interpreter, she gets the following.
</p>
<p class="commentary">On some platforms this will make no sense, and in those cases the function
will return the empty text.
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -381,6 +493,35 @@ user doesn't specify any particular interpreter, she gets:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">default_browser_interpreter</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Family compatibility. </b>This is used when, for example, source text headings are said to be "for
Glulx only". How are we to interpret that? The full story is at <a href="2-cmp.html" class="internal">Compatibility</a>,
but here we do at least match whether a given <span class="extract"><span class="extract-syntax">VM</span></span> is, or is not, "Glulx"
(or whatever may be).
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">TargetVMs::family</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::family</span></span>:<br/>Compatibility - <a href="2-cmp.html#SP10_4">&#167;10.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</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">VM</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no VM"</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">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">transpiler_family</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">TargetVMs::compatible_with</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">TargetVMs::compatible_with</span></span>:<br/>Compatibility - <a href="2-cmp.html#SP10_1">&#167;10.1</a>, <a href="2-cmp.html#SP10_3">&#167;10.3</a>, <a href="2-cmp.html#SP10_4">&#167;10.4</a>, <a href="2-cmp.html#SP10_5">&#167;10.5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">token</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">token</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Glulx"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">transpiler_family</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-tvm.html#SP9" class="function-link"><span class="function-syntax">TargetVMs::is_16_bit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">token</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Z-Machine"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">transpiler_family</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-tvm.html#SP9" class="function-link"><span class="function-syntax">TargetVMs::is_16_bit</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">) == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">transpiler_family</span><span class="plain-syntax">, </span><span class="identifier-syntax">token</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-arc.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-arc.html">arc</a></li><li class="progresscurrent">tvm</li><li class="progresssection"><a href="2-cmp.html">cmp</a></li><li class="progressnext"><a href="2-cmp.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -81,52 +81,69 @@ and where functions have names like <span class="extract"><span class="extract-s
uses a module of utility functions called <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>.
For more, see <a href="../../../inweb/docs/foundation-module/P-abgtf.html" class="internal">A Brief Guide to Foundation (in foundation)</a>.
</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Architecture versus VM. </b>The Inform 7 build process ultimately wants to make code for some target
virtual machine &mdash; traditionally, the Z or Glulx machines. But it does this
in two stages: first generating abstract Inter code, then further generating
VM code from that.
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Architecture versus VM. </b>The Inform 7 build process works in two stages: first it generates abstract
Inter code, then it further generates "final code" from that.
</p>
<p class="commentary">It's an appealing notion that this first stage might be VM-independent: that
<p class="commentary">It's an appealing notion that this first stage might be universal: that
is, that <a href="../inform7/index.html" class="internal">inform7</a> could generate the same Inter code regardless of the
final VM, and that only the second stage would vary according to target.
And this is nearly true, but not quite. There are (currently) two reasons
why not:
eventual build product needed, and that only the second stage would vary
according to this.
</p>
<p class="commentary">Which is very nearly true, but not quite. Here's why not:
</p>
<ul class="items"><li>(a) <a href="../inform7/index.html" class="internal">inform7</a> has to generate different code if integers are 16 rather
than 32 bits wide, and
</li><li>(b) it also generates different code with debugging enabled than without.
</li><li>(b) kits of Inter code normally used in compilation make certain other
architectural assumptions based on the integer size (for example, the
assembly-language syntax and semantics are different in these cases);
</li><li>(c) it also generates different code with debugging enabled than without.
</li></ul>
<p class="commentary">Reason (b) could be avoided, at some cost in complexity, but reason (a) is
something we cannot sensibly avoid without making Inter a much higher-level
<p class="commentary">Reason (c) could be avoided, at some cost in complexity, but reasons (a) and (b)
are something we cannot sensibly avoid without making Inter a much higher-level
form of bytecode. Instead, we have "architectures" for Inter: for example,
32-bit with debugging enabled is the <span class="extract"><span class="extract-syntax">32d</span></span> architecture. See <a href="2-arc.html" class="internal">Architectures</a>;
if ever we introduce a 64-bit VM, that will need new architectures, and
this is where they would go.
</p>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>A <a href="2-tvm.html#SP1" class="internal">target_vm</a> object, on the other hand, represents an actual choice of
virtual machine. For example, Glulx is a <a href="2-tvm.html#SP1" class="internal">target_vm</a>. The compilation
process thus involves a combination of both architecture and target:
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>A <a href="2-tvm.html#SP2" class="internal">target_vm</a> object, on the other hand, expresses the choices made at
the second stage too. The term "VM" is traditional here, and stands for
"virtual machine", because until 2021, Inform could only generate code which
would ultimately run on virtual machines called Glulx and the Z-machine. But it
can now, for example, also generate C.
</p>
<p class="commentary">As a result, "VM" now has a more general meaning, and really means "form of
final code generation". The Glulx format used to be specified by supplying the
command-line option <span class="extract"><span class="extract-syntax">-format=ulx</span></span> to <a href="../inform7/index.html" class="internal">inform7</a> or <a href="../inter/index.html" class="internal">inter</a>: that still works,
though it is deprecated, and <span class="extract"><span class="extract-syntax">-format=Inform6/32d</span></span> is better. But equally
possible now would be <span class="extract"><span class="extract-syntax">-format=C/32d</span></span>. Here the target is a native executable
to be compiled with a C compiler.
</p>
<p class="commentary">As these new-style <span class="extract"><span class="extract-syntax">-format</span></span> options suggest, the compilation process thus
involves a combination of both architecture and target:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="element-syntax">Source</span><span class="plain-syntax"> </span><span class="element-syntax">text</span><span class="plain-syntax"> -----------&gt; </span><span class="element-syntax">Inter</span><span class="plain-syntax"> </span><span class="element-syntax">code</span><span class="plain-syntax"> --------------&gt; </span><span class="element-syntax">Bytecode</span><span class="plain-syntax"> </span><span class="element-syntax">for</span>
<span class="plain-syntax"> </span><span class="function-syntax">INFORM7</span><span class="plain-syntax"> </span><span class="element-syntax">for</span><span class="plain-syntax"> </span><span class="element-syntax">architecture</span><span class="plain-syntax"> </span><span class="element-syntax">via</span><span class="plain-syntax"> </span><span class="function-syntax">INFORM6</span><span class="plain-syntax"> </span><span class="element-syntax">target</span><span class="plain-syntax"> </span><span class="element-syntax">virtual</span><span class="plain-syntax"> </span><span class="element-syntax">machine</span>
<span class="plain-syntax"> </span><span class="element-syntax">depends</span><span class="plain-syntax"> </span><span class="element-syntax">on</span><span class="plain-syntax"> </span><span class="element-syntax">architecture</span><span class="plain-syntax">: </span><span class="element-syntax">depends</span><span class="plain-syntax"> </span><span class="element-syntax">on</span><span class="plain-syntax"> </span><span class="element-syntax">target</span><span class="plain-syntax">:</span>
<span class="plain-syntax"> </span><span class="element-syntax">Source</span><span class="plain-syntax"> </span><span class="element-syntax">text</span><span class="plain-syntax"> -----------&gt; </span><span class="element-syntax">Inter</span><span class="plain-syntax"> </span><span class="element-syntax">code</span><span class="plain-syntax"> ----------------&gt; </span><span class="element-syntax">Bytecode</span><span class="plain-syntax"> </span><span class="element-syntax">for</span>
<span class="plain-syntax"> </span><span class="function-syntax">INFORM7</span><span class="plain-syntax"> </span><span class="element-syntax">via</span><span class="plain-syntax"> </span><span class="function-syntax">INFORM6</span><span class="plain-syntax"> </span><span class="element-syntax">target</span><span class="plain-syntax"> </span><span class="element-syntax">virtual</span><span class="plain-syntax"> </span><span class="element-syntax">machine</span>
<span class="plain-syntax"> ----------------&gt; </span><span class="element-syntax">Executable</span>
<span class="plain-syntax"> </span><span class="element-syntax">via</span><span class="plain-syntax"> </span><span class="function-syntax">CLANG</span><span class="plain-syntax">/</span><span class="function-syntax">GCC</span>
<span class="plain-syntax"> ...</span>
</pre>
<p class="commentary">Each VM can be used with just one architecture: use the function
<a href="2-tvm.html#SP12" class="internal">TargetVMs::get_architecture</a> to obtain this. It might seem reasonable
to say that Glulx ought to be viable with both <span class="extract"><span class="extract-syntax">32</span></span> and <span class="extract"><span class="extract-syntax">32d</span></span> architectures,
but in fact "Glulx" is not a single virtual machine but a family of them.
A specific member of this family would be the <a href="2-tvm.html#SP1" class="internal">target_vm</a> representing
Glulx version 3.1.2 with debugging enabled, and that can be used with the
<span class="extract"><span class="extract-syntax">32d</span></span> but not the <span class="extract"><span class="extract-syntax">32</span></span> architecture.
</p>
<p class="commentary">There can in principle be numerous VMs in any given family; see
<a href="2-tvm.html#SP6" class="internal">TargetVMs::find_in_family</a> to obtain family members with given behaviour,
and in general see <a href="2-tvm.html" class="internal">Target Virtual Machines</a> for more.
<p class="commentary">Note that a single <a href="2-tvm.html#SP2" class="internal">target_vm</a> object can be used with just one architecture:
use the function <a href="2-tvm.html#SP11" class="internal">TargetVMs::get_architecture</a> to obtain this. If a target supports
multiple architectures, then there will be multiple <a href="2-tvm.html#SP2" class="internal">target_vm</a> objects for it,
one for each architecture it supports. For example, the Glulx VM can be reached
by <span class="extract"><span class="extract-syntax">Inform6/32</span></span> or <span class="extract"><span class="extract-syntax">Inform6/32d</span></span>. There can also be multiple versions: for example,
<span class="extract"><span class="extract-syntax">Inform6/16/v8</span></span> is a valid target. The function <a href="2-tvm.html#SP6" class="internal">TargetVMs::find</a> finds the
<a href="2-tvm.html#SP2" class="internal">target_vm</a> object associated with a given textual form like <span class="extract"><span class="extract-syntax">"C/32d"</span></span>, if
the toolchain supports this.
</p>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Compatibility. </b>Not all software in the Inform stack &mdash; source text from the user, extensions,

View file

@ -89,7 +89,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="reserved-syntax">target_vm</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../arch-module/2-cmp.html#SP11" class="function-link"><span class="function-syntax">Compatibility::test</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="../arch-module/2-tvm.html#SP4" class="function-link"><span class="function-syntax">TargetVMs::write</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../arch-module/2-tvm.html#SP5" class="function-link"><span class="function-syntax">TargetVMs::write</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>

View file

@ -112,9 +112,24 @@ what the Inform UI apps typically call when the user clicks "Go":
<pre class="ConsoleText-displayed-code all-displayed-code code-font">
<span class="ConsoleText-plain-syntax"> </span><span class="ConsoleText-element-syntax">$</span><span class="ConsoleText-plain-syntax"> </span><span class="ConsoleText-function-syntax">inform7/Tangled/inform7</span><span class="ConsoleText-identifier-syntax"> -internal</span><span class="ConsoleText-plain-syntax"> I</span><span class="ConsoleText-identifier-syntax"> -external</span><span class="ConsoleText-plain-syntax"> E</span><span class="ConsoleText-identifier-syntax"> -project</span><span class="ConsoleText-plain-syntax"> P</span><span class="ConsoleText-identifier-syntax"> -format</span><span class="ConsoleText-plain-syntax">=F</span>
</pre>
<p class="commentary">for suitable pathnames <span class="extract"><span class="ConsoleText-extract-syntax">I</span></span>, <span class="extract"><span class="ConsoleText-extract-syntax">E</span></span>, <span class="extract"><span class="ConsoleText-extract-syntax">P</span></span> and a choice of <span class="extract"><span class="ConsoleText-extract-syntax">F</span></span>. To dispose of this
first, <span class="extract"><span class="ConsoleText-extract-syntax">-format=ulx</span></span> tells Inform to compile to the Glulx story file, and
<span class="extract"><span class="ConsoleText-extract-syntax">-format=z8</span></span> to (version 8 of) the Z-machine.
<p class="commentary">for suitable pathnames <span class="extract"><span class="ConsoleText-extract-syntax">I</span></span>, <span class="extract"><span class="ConsoleText-extract-syntax">E</span></span>, <span class="extract"><span class="ConsoleText-extract-syntax">P</span></span> and a choice of <span class="extract"><span class="ConsoleText-extract-syntax">F</span></span>.
</p>
<p class="commentary">The format <span class="extract"><span class="ConsoleText-extract-syntax">F</span></span> can have quite a complex syntax. It takes the form of a
sequence of criteria divided by slashes. The first will be the name of the
language which <a href="index.html" class="internal">inform7</a> is writing as its output; the second will be the
architecture used. Thus, <span class="extract"><span class="ConsoleText-extract-syntax">inform6/32d</span></span> means "32-bit Inform 6 code with
debugging enabled", and this in practice is what the Inform UI apps make
when Glulx is the preferred virtual machine, as it is by default. But other
alternatives are available at the command line, and it's also possible for
<span class="extract"><span class="ConsoleText-extract-syntax">-format</span></span> to specify a semantic version number for the target, or some
compilation options. See <a href="../arch-module/index.html" class="internal">arch</a> for a fuller description.
</p>
<p class="commentary">In previous releases of Inform, <span class="extract"><span class="ConsoleText-extract-syntax">-format=F</span></span> had a cruder syntax in which only
<span class="extract"><span class="ConsoleText-extract-syntax">-format=ulx</span></span>, <span class="extract"><span class="ConsoleText-extract-syntax">-format=z5</span></span> and <span class="extract"><span class="ConsoleText-extract-syntax">-format=z8</span></span> were allowed. Those are still
recognised, but deprecated. Inform will print a warning about this and supply
the equivalent modern notation if one is used.
</p>
<p class="commentary">The project <span class="extract"><span class="ConsoleText-extract-syntax">P</span></span> is the directory holding the project to compile, such as

View file

@ -84,13 +84,13 @@ which take more than 1/1000th of the total running time.
<pre class="undisplayed-code all-displayed-code code-font">
<span class="plain-syntax">100.0% in inform7 run</span>
<span class="plain-syntax"> 55.2% in compilation to Inter</span>
<span class="plain-syntax"> 40.1% in </span><a href="../core-module/1-htc.html#SP9" class="internal">Sequence::undertake_queued_tasks</a>
<span class="plain-syntax"> 3.4% in </span><a href="../assertions-module/2-ptmn.html#SP1" class="internal">MajorNodes::pre_pass</a>
<span class="plain-syntax"> 2.6% in </span><a href="../assertions-module/2-ptmn.html#SP1" class="internal">MajorNodes::pass_1</a>
<span class="plain-syntax"> 1.5% in </span><a href="../runtime-module/6-pi.html#SP1" class="internal">RTPhrasebook::compile_entries</a>
<span class="plain-syntax"> 54.0% in compilation to Inter</span>
<span class="plain-syntax"> 39.4% in </span><a href="../core-module/1-htc.html#SP9" class="internal">Sequence::undertake_queued_tasks</a>
<span class="plain-syntax"> 3.3% in </span><a href="../assertions-module/2-ptmn.html#SP1" class="internal">MajorNodes::pre_pass</a>
<span class="plain-syntax"> 2.5% in </span><a href="../assertions-module/2-ptmn.html#SP1" class="internal">MajorNodes::pass_1</a>
<span class="plain-syntax"> 1.3% in </span><a href="../assertions-module/5-id.html#SP4" class="internal">ImperativeDefinitions::assess_all</a>
<span class="plain-syntax"> 1.1% in </span><a href="../runtime-module/5-kc.html#SP10" class="internal">RTKindConstructors::compile</a>
<span class="plain-syntax"> 1.3% in </span><a href="../runtime-module/6-pi.html#SP1" class="internal">RTPhrasebook::compile_entries</a>
<span class="plain-syntax"> 1.2% in </span><a href="../runtime-module/5-kc.html#SP10" class="internal">RTKindConstructors::compile</a>
<span class="plain-syntax"> 0.4% in </span><a href="../assertions-module/5-id.html#SP5" class="internal">ImperativeDefinitions::compile_first_block</a>
<span class="plain-syntax"> 0.4% in </span><a href="../assertions-module/2-ptmn.html#SP1" class="internal">MajorNodes::pass_2</a>
<span class="plain-syntax"> 0.4% in </span><a href="../core-module/1-htc.html#SP9" class="internal">Sequence::undertake_queued_tasks</a>
@ -101,23 +101,23 @@ which take more than 1/1000th of the total running time.
<span class="plain-syntax"> 0.1% in </span><a href="../runtime-module/5-kc.html#SP10_7" class="internal">RTKindConstructors::compile_permissions</a>
<span class="plain-syntax"> 0.1% in </span><a href="../core-module/1-wtc.html#SP9" class="internal">Task::make_built_in_kind_constructors</a>
<span class="plain-syntax"> 0.1% in </span><a href="../knowledge-module/5-tmw.html#SP3" class="internal">World::stages_II_and_III</a>
<span class="plain-syntax"> 2.1% not specifically accounted for</span>
<span class="plain-syntax"> 42.8% in running Inter pipeline</span>
<span class="plain-syntax"> 10.9% in step preparation</span>
<span class="plain-syntax"> 9.8% in inter step 7/14: consolidate-text</span>
<span class="plain-syntax"> 8.1% in inter step 14/14: generate inform6 -&gt; auto.inf</span>
<span class="plain-syntax"> 8.0% in inter step 2/14: link</span>
<span class="plain-syntax"> 1.5% in inter step 10/14: make-identifiers-unique</span>
<span class="plain-syntax"> 0.4% in inter step 11/14: reconcile-verbs</span>
<span class="plain-syntax"> 0.2% in inter step 13/14: eliminate-redundant-operations</span>
<span class="plain-syntax"> 0.2% in inter step 6/14: assimilate</span>
<span class="plain-syntax"> 0.2% in inter step 8/14: resolve-external-symbols</span>
<span class="plain-syntax"> 0.2% in inter step 9/14: inspect-plugs</span>
<span class="plain-syntax"> 0.1% in inter step 12/14: eliminate-redundant-labels</span>
<span class="plain-syntax"> 0.1% in inter step 3/14: merge-template &lt;- none</span>
<span class="plain-syntax"> 0.1% in inter step 4/14: parse-linked-matter</span>
<span class="plain-syntax"> 0.1% in inter step 5/14: resolve-conditional-compilation</span>
<span class="plain-syntax"> 2.4% not specifically accounted for</span>
<span class="plain-syntax"> 1.9% not specifically accounted for</span>
<span class="plain-syntax"> 44.0% in running Inter pipeline</span>
<span class="plain-syntax"> 11.6% in step preparation</span>
<span class="plain-syntax"> 10.1% in inter step 7/15: consolidate-text</span>
<span class="plain-syntax"> 8.1% in inter step 2/15: link</span>
<span class="plain-syntax"> 7.8% in inter step 15/15: generate inform6 -&gt; auto.inf</span>
<span class="plain-syntax"> 1.6% in inter step 11/15: make-identifiers-unique</span>
<span class="plain-syntax"> 0.4% in inter step 12/15: reconcile-verbs</span>
<span class="plain-syntax"> 0.2% in inter step 10/15: detect-indirect-calls</span>
<span class="plain-syntax"> 0.2% in inter step 14/15: eliminate-redundant-operations</span>
<span class="plain-syntax"> 0.2% in inter step 6/15: assimilate</span>
<span class="plain-syntax"> 0.2% in inter step 8/15: resolve-external-symbols</span>
<span class="plain-syntax"> 0.2% in inter step 9/15: inspect-plugs</span>
<span class="plain-syntax"> 0.1% in inter step 13/15: eliminate-redundant-labels</span>
<span class="plain-syntax"> 0.1% in inter step 4/15: parse-linked-matter</span>
<span class="plain-syntax"> 0.1% in inter step 5/15: resolve-conditional-compilation</span>
<span class="plain-syntax"> 2.5% not specifically accounted for</span>
<span class="plain-syntax"> 1.6% in supervisor</span>
<span class="plain-syntax"> 0.3% not specifically accounted for</span>
</pre>
@ -128,75 +128,75 @@ represent less than 1/1000th of the total.
</p>
<pre class="undisplayed-code all-displayed-code code-font">
<span class="plain-syntax">Total memory consumption was 399081K = 390 MB</span>
<span class="plain-syntax">Total memory consumption was 383663K = 375 MB</span>
<span class="plain-syntax">60.3% was used for 1995520 objects, in 371144 frames in 301 x 800K = 240800K = 235 MB:</span>
<span class="plain-syntax">61.5% was used for 1991443 objects, in 368767 frames in 295 x 800K = 236000K = 230 MB:</span>
<span class="plain-syntax"> 10.2% inter_tree_node_array 58 x 8192 = 475136 objects, 41813824 bytes</span>
<span class="plain-syntax"> 7.0% text_stream_array 5128 x 100 = 512800 objects, 28880896 bytes</span>
<span class="plain-syntax"> 4.2% linked_list 30846 objects, 17273760 bytes</span>
<span class="plain-syntax"> 3.9% inter_symbol_array 139 x 1024 = 142336 objects, 15946080 bytes</span>
<span class="plain-syntax"> 2.5% parse_node 129399 objects, 10351920 bytes</span>
<span class="plain-syntax"> 10.6% inter_tree_node_array 58 x 8192 = 475136 objects, 41813824 bytes</span>
<span class="plain-syntax"> 7.3% text_stream_array 5126 x 100 = 512600 objects, 28869632 bytes</span>
<span class="plain-syntax"> 4.3% linked_list 30605 objects, 17138800 bytes</span>
<span class="plain-syntax"> 4.0% inter_symbol_array 139 x 1024 = 142336 objects, 15946080 bytes</span>
<span class="plain-syntax"> 2.6% parse_node 128478 objects, 10278240 bytes</span>
<span class="plain-syntax"> 1.8% verb_conjugation 160 objects, 7425280 bytes</span>
<span class="plain-syntax"> 1.3% parse_node_annotation_array 345 x 500 = 172500 objects, 5531040 bytes</span>
<span class="plain-syntax"> 1.3% parse_node_annotation_array 343 x 500 = 171500 objects, 5498976 bytes</span>
<span class="plain-syntax"> 0.8% pcalc_prop_array 25 x 1000 = 25000 objects, 3400800 bytes</span>
<span class="plain-syntax"> 0.8% inter_name_array 69 x 1000 = 69000 objects, 3314208 bytes</span>
<span class="plain-syntax"> 0.6% kind_array 68 x 1000 = 68000 objects, 2722176 bytes</span>
<span class="plain-syntax"> 0.6% kind_array 67 x 1000 = 67000 objects, 2682144 bytes</span>
<span class="plain-syntax"> 0.5% inter_name_generator_array 53 x 1000 = 53000 objects, 2121696 bytes</span>
<span class="plain-syntax"> 0.4% inter_schema_token 13464 objects, 1938816 bytes</span>
<span class="plain-syntax"> 0.4% inter_package 26562 objects, 1912464 bytes</span>
<span class="plain-syntax"> 0.4% package_request 21138 objects, 1860144 bytes</span>
<span class="plain-syntax"> 0.4% inter_schema_token 13430 objects, 1933920 bytes</span>
<span class="plain-syntax"> 0.4% inter_package 26435 objects, 1903320 bytes</span>
<span class="plain-syntax"> 0.4% package_request 20997 objects, 1847736 bytes</span>
<span class="plain-syntax"> 0.4% vocabulary_entry_array 161 x 100 = 16100 objects, 1808352 bytes</span>
<span class="plain-syntax"> 0.4% inter_symbols_table 26562 objects, 1699968 bytes</span>
<span class="plain-syntax"> 0.3% dictionary 33230 objects, 1595040 bytes</span>
<span class="plain-syntax"> 0.4% inter_symbols_table 26435 objects, 1691840 bytes</span>
<span class="plain-syntax"> 0.4% dictionary 33115 objects, 1589520 bytes</span>
<span class="plain-syntax"> 0.3% match_trie_array 11 x 1000 = 11000 objects, 1496352 bytes</span>
<span class="plain-syntax"> 0.3% i6_schema_array 23 x 100 = 2300 objects, 1380736 bytes</span>
<span class="plain-syntax"> 0.3% dict_entry_array 393 x 100 = 39300 objects, 1270176 bytes</span>
<span class="plain-syntax"> 0.3% dict_entry_array 399 x 100 = 39900 objects, 1289568 bytes</span>
<span class="plain-syntax"> 0.2% map_data 670 objects, 1125600 bytes</span>
<span class="plain-syntax"> 0.2% id_body 940 objects, 1075360 bytes</span>
<span class="plain-syntax"> 0.2% adjective_meaning 202 objects, 1000304 bytes</span>
<span class="plain-syntax"> 0.2% excerpt_meaning 3099 objects, 966888 bytes</span>
<span class="plain-syntax"> 0.2% id_body 898 objects, 1027312 bytes</span>
<span class="plain-syntax"> 0.2% adjective_meaning 196 objects, 970592 bytes</span>
<span class="plain-syntax"> 0.2% excerpt_meaning 3036 objects, 947232 bytes</span>
<span class="plain-syntax"> 0.2% production 3872 objects, 898304 bytes</span>
<span class="plain-syntax"> 0.2% ptoken 8382 objects, 871728 bytes</span>
<span class="plain-syntax"> 0.2% grammatical_usage 3611 objects, 866640 bytes</span>
<span class="plain-syntax"> 0.2% individual_form 2561 objects, 860496 bytes</span>
<span class="plain-syntax"> 0.2% inter_schema_node 8666 objects, 831936 bytes</span>
<span class="plain-syntax"> 0.2% grammatical_usage 3591 objects, 861840 bytes</span>
<span class="plain-syntax"> 0.2% individual_form 2537 objects, 852432 bytes</span>
<span class="plain-syntax"> 0.2% inter_schema_node 8647 objects, 830112 bytes</span>
<span class="plain-syntax"> 0.1% unary_predicate_array 16 x 1000 = 16000 objects, 640512 bytes</span>
<span class="plain-syntax"> 0.1% local_variable_array 47 x 100 = 4700 objects, 452704 bytes</span>
<span class="plain-syntax"> 0.1% local_variable_array 46 x 100 = 4600 objects, 443072 bytes</span>
<span class="plain-syntax"> ---- verb_usage 1128 objects, 388032 bytes</span>
<span class="plain-syntax"> ---- scan_directory 94 objects, 388032 bytes</span>
<span class="plain-syntax"> ---- rule 469 objects, 367696 bytes</span>
<span class="plain-syntax"> ---- verb_form 386 objects, 345856 bytes</span>
<span class="plain-syntax"> ---- noun 2380 objects, 285600 bytes</span>
<span class="plain-syntax"> ---- compilation_subtask 3346 objects, 267680 bytes</span>
<span class="plain-syntax"> ---- noun 2360 objects, 283200 bytes</span>
<span class="plain-syntax"> ---- compilation_subtask 3338 objects, 267040 bytes</span>
<span class="plain-syntax"> ---- inference_subject 665 objects, 260680 bytes</span>
<span class="plain-syntax"> ---- inter_annotation_array 1 x 8192 objects, 196640 bytes</span>
<span class="plain-syntax"> ---- binary_predicate 321 objects, 169488 bytes</span>
<span class="plain-syntax"> ---- hierarchy_location 1108 objects, 168416 bytes</span>
<span class="plain-syntax"> ---- linguistic_stock_item 3316 objects, 159168 bytes</span>
<span class="plain-syntax"> ---- hierarchy_location 1103 objects, 167656 bytes</span>
<span class="plain-syntax"> ---- linguistic_stock_item 3292 objects, 158016 bytes</span>
<span class="plain-syntax"> ---- rule_family_data 400 objects, 147200 bytes</span>
<span class="plain-syntax"> ---- nonterminal 760 objects, 139840 bytes</span>
<span class="plain-syntax"> ---- nascent_array 2126 objects, 136064 bytes</span>
<span class="plain-syntax"> ---- nascent_array 2104 objects, 134656 bytes</span>
<span class="plain-syntax"> ---- documentation_ref 1273 objects, 112024 bytes</span>
<span class="plain-syntax"> ---- inference 1703 objects, 108992 bytes</span>
<span class="plain-syntax"> ---- imperative_defn 1376 objects, 99072 bytes</span>
<span class="plain-syntax"> ---- inter_tree 6 objects, 98064 bytes</span>
<span class="plain-syntax"> ---- noun_usage 2402 objects, 96080 bytes</span>
<span class="plain-syntax"> ---- inter_tree 6 objects, 98304 bytes</span>
<span class="plain-syntax"> ---- anl_entry_array 2 x 1000 = 2000 objects, 96064 bytes</span>
<span class="plain-syntax"> ---- imperative_defn 1334 objects, 96048 bytes</span>
<span class="plain-syntax"> ---- noun_usage 2382 objects, 95280 bytes</span>
<span class="plain-syntax"> ---- preposition 273 objects, 87360 bytes</span>
<span class="plain-syntax"> ---- lexical_cluster 2517 objects, 80544 bytes</span>
<span class="plain-syntax"> ---- pcalc_term_array 2 x 1000 = 2000 objects, 80064 bytes</span>
<span class="plain-syntax"> ---- lexical_cluster 2493 objects, 79776 bytes</span>
<span class="plain-syntax"> ---- kind_variable_declaration 1652 objects, 79296 bytes</span>
<span class="plain-syntax"> ---- inter_schema 1508 objects, 72384 bytes</span>
<span class="plain-syntax"> ---- inter_schema 1503 objects, 72144 bytes</span>
<span class="plain-syntax"> ---- label_namespace 1468 objects, 70464 bytes</span>
<span class="plain-syntax"> ---- rulebook 407 objects, 68376 bytes</span>
<span class="plain-syntax"> ---- spatial_data 670 objects, 64320 bytes</span>
<span class="plain-syntax"> ---- kind_macro_definition 9 objects, 62280 bytes</span>
<span class="plain-syntax"> ---- booking 860 objects, 61920 bytes</span>
<span class="plain-syntax"> ---- scenes_rcd_data 1880 objects, 60160 bytes</span>
<span class="plain-syntax"> ---- actions_rcd_data 1880 objects, 60160 bytes</span>
<span class="plain-syntax"> ---- command_grammar 130 objects, 58240 bytes</span>
<span class="plain-syntax"> ---- kind_constructor 77 objects, 57904 bytes</span>
<span class="plain-syntax"> ---- actions_rcd_data 1796 objects, 57472 bytes</span>
<span class="plain-syntax"> ---- scenes_rcd_data 1796 objects, 57472 bytes</span>
<span class="plain-syntax"> ---- table 7 objects, 56672 bytes</span>
<span class="plain-syntax"> ---- pcalc_func_array 1 x 1000 objects, 56032 bytes</span>
<span class="plain-syntax"> ---- cg_line 230 objects, 53360 bytes</span>
@ -204,17 +204,17 @@ represent less than 1/1000th of the total.
<span class="plain-syntax"> ---- property_inference_data 1315 objects, 52600 bytes</span>
<span class="plain-syntax"> ---- response_message 407 objects, 52096 bytes</span>
<span class="plain-syntax"> ---- ap_clause_array 2 x 400 = 800 objects, 51264 bytes</span>
<span class="plain-syntax"> ---- inter_node_list 769 objects, 43064 bytes</span>
<span class="plain-syntax"> ---- inter_node_list 765 objects, 42840 bytes</span>
<span class="plain-syntax"> ---- text_substitution 436 objects, 41856 bytes</span>
<span class="plain-syntax"> ---- anl_clause_array 1 x 1000 objects, 40032 bytes</span>
<span class="plain-syntax"> ---- activity_list_array 1 x 1000 objects, 40032 bytes</span>
<span class="plain-syntax"> ---- to_family_data 496 objects, 39680 bytes</span>
<span class="plain-syntax"> ---- shared_variable_access_list_array 12 x 100 = 1200 objects, 38784 bytes</span>
<span class="plain-syntax"> ---- parsing_data 670 objects, 37520 bytes</span>
<span class="plain-syntax"> ---- heading 198 objects, 36432 bytes</span>
<span class="plain-syntax"> ---- to_family_data 458 objects, 36640 bytes</span>
<span class="plain-syntax"> ---- heading 195 objects, 35880 bytes</span>
<span class="plain-syntax"> ---- production_list 617 objects, 34552 bytes</span>
<span class="plain-syntax"> ---- regions_data 670 objects, 32160 bytes</span>
<span class="plain-syntax"> ---- counting_data 670 objects, 32160 bytes</span>
<span class="plain-syntax"> ---- regions_data 670 objects, 32160 bytes</span>
<span class="plain-syntax"> ---- HTML_tag_array 1 x 1000 objects, 32032 bytes</span>
<span class="plain-syntax"> ---- property_permission 96 objects, 31488 bytes</span>
<span class="plain-syntax"> ---- stack_frame_box 304 objects, 29184 bytes</span>
@ -226,7 +226,7 @@ represent less than 1/1000th of the total.
<span class="plain-syntax"> ---- nonlocal_variable 93 objects, 20088 bytes</span>
<span class="plain-syntax"> ---- property 146 objects, 19856 bytes</span>
<span class="plain-syntax"> ---- timed_rules_rfd_data 400 objects, 19200 bytes</span>
<span class="plain-syntax"> ---- method 395 objects, 18960 bytes</span>
<span class="plain-syntax"> ---- method 394 objects, 18912 bytes</span>
<span class="plain-syntax"> ---- pcalc_prop_deferral 86 objects, 17888 bytes</span>
<span class="plain-syntax"> ---- instance 167 objects, 17368 bytes</span>
<span class="plain-syntax"> ---- parse_node_tree 20 objects, 17280 bytes</span>
@ -234,15 +234,14 @@ represent less than 1/1000th of the total.
<span class="plain-syntax"> ---- linked_list_item_array 1 x 1000 objects, 16032 bytes</span>
<span class="plain-syntax"> ---- action_name_list_array 1 x 1000 objects, 16032 bytes</span>
<span class="plain-syntax"> ---- match_avinue_array 1 x 1000 objects, 16032 bytes</span>
<span class="plain-syntax"> ---- to_phrase_request 59 objects, 15576 bytes</span>
<span class="plain-syntax"> ---- adjective 137 objects, 15344 bytes</span>
<span class="plain-syntax"> ---- adjective 133 objects, 14896 bytes</span>
<span class="plain-syntax"> ---- to_phrase_request 55 objects, 14520 bytes</span>
<span class="plain-syntax"> ---- booking_list 407 objects, 13024 bytes</span>
<span class="plain-syntax"> ---- adjective_iname_holder 320 objects, 12800 bytes</span>
<span class="plain-syntax"> ---- adjective_iname_holder 314 objects, 12560 bytes</span>
<span class="plain-syntax"> ---- pathname 294 objects, 11760 bytes</span>
<span class="plain-syntax"> ---- uniqueness_count 452 objects, 10848 bytes</span>
<span class="plain-syntax"> ---- stopwatch_timer 112 objects, 8960 bytes</span>
<span class="plain-syntax"> ---- filename 209 objects, 8360 bytes</span>
<span class="plain-syntax"> ---- equation_node 68 objects, 7616 bytes</span>
<span class="plain-syntax"> ---- uniqueness_count 453 objects, 10872 bytes</span>
<span class="plain-syntax"> ---- stopwatch_timer 113 objects, 9040 bytes</span>
<span class="plain-syntax"> ---- filename 212 objects, 8480 bytes</span>
<span class="plain-syntax"> ---- hierarchy_attachment_point 77 objects, 7392 bytes</span>
<span class="plain-syntax"> ---- understanding_item_array 3 x 100 = 300 objects, 7296 bytes</span>
<span class="plain-syntax"> ---- shared_variable_array 1 x 100 objects, 7232 bytes</span>
@ -250,72 +249,70 @@ represent less than 1/1000th of the total.
<span class="plain-syntax"> ---- verb 108 objects, 6048 bytes</span>
<span class="plain-syntax"> ---- text_literal_holder 144 objects, 5760 bytes</span>
<span class="plain-syntax"> ---- heading_tree 20 objects, 5440 bytes</span>
<span class="plain-syntax"> ---- inbuild_work 79 objects, 5056 bytes</span>
<span class="plain-syntax"> ---- inbuild_work 82 objects, 5248 bytes</span>
<span class="plain-syntax"> ---- build_vertex 44 objects, 4928 bytes</span>
<span class="plain-syntax"> ---- explicit_action_array 1 x 100 objects, 4832 bytes</span>
<span class="plain-syntax"> ---- value_property_data 84 objects, 4704 bytes</span>
<span class="plain-syntax"> ---- parsing_pp_data 96 objects, 4608 bytes</span>
<span class="plain-syntax"> ---- build_vertex 41 objects, 4592 bytes</span>
<span class="plain-syntax"> ---- inbuild_edition 55 objects, 3960 bytes</span>
<span class="plain-syntax"> ---- inbuild_edition 58 objects, 4176 bytes</span>
<span class="plain-syntax"> ---- inbuild_copy 39 objects, 4056 bytes</span>
<span class="plain-syntax"> ---- activity 35 objects, 3920 bytes</span>
<span class="plain-syntax"> ---- submodule_request 94 objects, 3760 bytes</span>
<span class="plain-syntax"> ---- inbuild_copy 36 objects, 3744 bytes</span>
<span class="plain-syntax"> ---- parse_node_annotation_type 114 objects, 3648 bytes</span>
<span class="plain-syntax"> ---- command_line_switch 43 objects, 3440 bytes</span>
<span class="plain-syntax"> ---- compatibility_specification 70 objects, 3360 bytes</span>
<span class="plain-syntax"> ---- property_setting_bp_data 84 objects, 3360 bytes</span>
<span class="plain-syntax"> ---- method_set 103 objects, 3296 bytes</span>
<span class="plain-syntax"> ---- kind_constructor_comparison_schema_array 1 x 100 objects, 3232 bytes</span>
<span class="plain-syntax"> ---- compatibility_specification 67 objects, 3216 bytes</span>
<span class="plain-syntax"> ---- inform_extension 19 objects, 3192 bytes</span>
<span class="plain-syntax"> ---- definition 44 objects, 3168 bytes</span>
<span class="plain-syntax"> ---- either_or_property_data 62 objects, 2976 bytes</span>
<span class="plain-syntax"> ---- definition 40 objects, 2880 bytes</span>
<span class="plain-syntax"> ---- use_option 29 objects, 2552 bytes</span>
<span class="plain-syntax"> ---- part_of_inference_data 79 objects, 2528 bytes</span>
<span class="plain-syntax"> ---- parentage_inference_data 79 objects, 2528 bytes</span>
<span class="plain-syntax"> ---- part_of_inference_data 79 objects, 2528 bytes</span>
<span class="plain-syntax"> ---- kind_constructor_instance_array 1 x 100 objects, 2432 bytes</span>
<span class="plain-syntax"> ---- kind_constructor_casting_rule_array 1 x 100 objects, 2432 bytes</span>
<span class="plain-syntax"> ---- inter_construct 30 objects, 2400 bytes</span>
<span class="plain-syntax"> ---- equation_symbol 30 objects, 2400 bytes</span>
<span class="plain-syntax"> ---- semver_range 22 objects, 2288 bytes</span>
<span class="plain-syntax"> ---- scene 1 object, 2096 bytes</span>
<span class="plain-syntax"> ---- pipeline_step 14 objects, 1680 bytes</span>
<span class="plain-syntax"> ---- pipeline_step 15 objects, 2040 bytes</span>
<span class="plain-syntax"> ---- pronoun_usage 42 objects, 1680 bytes</span>
<span class="plain-syntax"> ---- table_contribution_array 1 x 100 objects, 1632 bytes</span>
<span class="plain-syntax"> ---- plugin 25 objects, 1600 bytes</span>
<span class="plain-syntax"> ---- cached_kind_declaration 39 objects, 1560 bytes</span>
<span class="plain-syntax"> ---- cached_kind_declaration 37 objects, 1480 bytes</span>
<span class="plain-syntax"> ---- noun_filter_token 22 objects, 1408 bytes</span>
<span class="plain-syntax"> ---- build_script 44 objects, 1408 bytes</span>
<span class="plain-syntax"> ---- inter_tree_location_list 34 objects, 1360 bytes</span>
<span class="plain-syntax"> ---- inter_annotation_form 34 objects, 1360 bytes</span>
<span class="plain-syntax"> ---- special_meaning_holder 33 objects, 1320 bytes</span>
<span class="plain-syntax"> ---- build_script 41 objects, 1312 bytes</span>
<span class="plain-syntax"> ---- constant_phrase 20 objects, 1280 bytes</span>
<span class="plain-syntax"> ---- table_column 16 objects, 1280 bytes</span>
<span class="plain-syntax"> ---- invocation_options_array 1 x 100 objects, 1224 bytes</span>
<span class="plain-syntax"> ---- direction_inference_data 30 objects, 1200 bytes</span>
<span class="plain-syntax"> ---- tree_inventory_item 28 objects, 1120 bytes</span>
<span class="plain-syntax"> ---- runtime_kind_structure 13 objects, 1040 bytes</span>
<span class="plain-syntax"> ---- target_vm 8 objects, 1088 bytes</span>
<span class="plain-syntax"> ---- quantifier 16 objects, 1024 bytes</span>
<span class="plain-syntax"> ---- submodule_identity 30 objects, 960 bytes</span>
<span class="plain-syntax"> ---- named_rulebook_outcome 15 objects, 960 bytes</span>
<span class="plain-syntax"> ---- pipeline_stage 19 objects, 912 bytes</span>
<span class="plain-syntax"> ---- pipeline_stage 20 objects, 960 bytes</span>
<span class="plain-syntax"> ---- code_generation 1 object, 888 bytes</span>
<span class="plain-syntax"> ---- inbuild_requirement 22 objects, 880 bytes</span>
<span class="plain-syntax"> ---- code_generation 1 object, 864 bytes</span>
<span class="plain-syntax"> ---- runtime_kind_structure 11 objects, 880 bytes</span>
<span class="plain-syntax"> ---- generated_segment 27 objects, 864 bytes</span>
<span class="plain-syntax"> ---- control_structure_phrase 12 objects, 864 bytes</span>
<span class="plain-syntax"> ---- cached_understanding 21 objects, 840 bytes</span>
<span class="plain-syntax"> ---- phrase_option_array 1 x 100 objects, 824 bytes</span>
<span class="plain-syntax"> ---- target_vm 6 objects, 816 bytes</span>
<span class="plain-syntax"> ---- inter_data_type 14 objects, 784 bytes</span>
<span class="plain-syntax"> ---- internal_test 15 objects, 720 bytes</span>
<span class="plain-syntax"> ---- inform_language 6 objects, 672 bytes</span>
<span class="plain-syntax"> ---- relation_guard 5 objects, 640 bytes</span>
<span class="plain-syntax"> ---- I6T_intervention 8 objects, 640 bytes</span>
<span class="plain-syntax"> ---- relation_guard 5 objects, 640 bytes</span>
<span class="plain-syntax"> ---- inter_warehouse_room 10 objects, 640 bytes</span>
<span class="plain-syntax"> ---- inbuild_search_result 15 objects, 600 bytes</span>
<span class="plain-syntax"> ---- rulebook_outcome 17 objects, 544 bytes</span>
<span class="plain-syntax"> ---- small_word_set 11 objects, 528 bytes</span>
<span class="plain-syntax"> ---- inform_kit 5 objects, 520 bytes</span>
<span class="plain-syntax"> ---- implication 13 objects, 520 bytes</span>
<span class="plain-syntax"> ---- equation 4 objects, 480 bytes</span>
<span class="plain-syntax"> ---- inform_pipeline 8 objects, 512 bytes</span>
<span class="plain-syntax"> ---- inference_family 11 objects, 440 bytes</span>
<span class="plain-syntax"> ---- i6_memory_setting 13 objects, 416 bytes</span>
<span class="plain-syntax"> ---- module_package 10 objects, 400 bytes</span>
@ -326,28 +323,27 @@ represent less than 1/1000th of the total.
<span class="plain-syntax"> ---- door_dir_notice 5 objects, 320 bytes</span>
<span class="plain-syntax"> ---- pronoun 8 objects, 320 bytes</span>
<span class="plain-syntax"> ---- grammatical_category 8 objects, 320 bytes</span>
<span class="plain-syntax"> ---- inform_pipeline 5 objects, 320 bytes</span>
<span class="plain-syntax"> ---- tree_inventory 1 object, 312 bytes</span>
<span class="plain-syntax"> ---- build_step 4 objects, 288 bytes</span>
<span class="plain-syntax"> ---- up_family 9 objects, 288 bytes</span>
<span class="plain-syntax"> ---- compilation_unit 5 objects, 280 bytes</span>
<span class="plain-syntax"> ---- contents_entry 7 objects, 280 bytes</span>
<span class="plain-syntax"> ---- build_step 4 objects, 288 bytes</span>
<span class="plain-syntax"> ---- explicit_bp_data 5 objects, 280 bytes</span>
<span class="plain-syntax"> ---- door_to_notice 5 objects, 280 bytes</span>
<span class="plain-syntax"> ---- compilation_unit 5 objects, 280 bytes</span>
<span class="plain-syntax"> ---- contents_entry 7 objects, 280 bytes</span>
<span class="plain-syntax"> ---- verb_usage_tier 5 objects, 240 bytes</span>
<span class="plain-syntax"> ---- adjective_meaning_family 7 objects, 224 bytes</span>
<span class="plain-syntax"> ---- test_scenario 1 object, 216 bytes</span>
<span class="plain-syntax"> ---- release_instructions 1 object, 208 bytes</span>
<span class="plain-syntax"> ---- code_generation_target 5 objects, 200 bytes</span>
<span class="plain-syntax"> ---- build_skill 5 objects, 200 bytes</span>
<span class="plain-syntax"> ---- plural_dictionary_entry 4 objects, 192 bytes</span>
<span class="plain-syntax"> ---- kit_dependency 4 objects, 192 bytes</span>
<span class="plain-syntax"> ---- plural_dictionary_entry 4 objects, 192 bytes</span>
<span class="plain-syntax"> ---- inform_project 1 object, 176 bytes</span>
<span class="plain-syntax"> ---- kov_value_stick 3 objects, 168 bytes</span>
<span class="plain-syntax"> ---- imperative_defn_family 4 objects, 160 bytes</span>
<span class="plain-syntax"> ---- inter_architecture 4 objects, 160 bytes</span>
<span class="plain-syntax"> ---- inference_subject_family 5 objects, 160 bytes</span>
<span class="plain-syntax"> ---- link_instruction 4 objects, 160 bytes</span>
<span class="plain-syntax"> ---- inference_subject_family 5 objects, 160 bytes</span>
<span class="plain-syntax"> ---- inter_architecture 4 objects, 160 bytes</span>
<span class="plain-syntax"> ---- codegen_pipeline 1 object, 128 bytes</span>
<span class="plain-syntax"> ---- element_activation 4 objects, 128 bytes</span>
<span class="plain-syntax"> ---- inbuild_nest 3 objects, 120 bytes</span>
@ -356,36 +352,37 @@ represent less than 1/1000th of the total.
<span class="plain-syntax"> ---- compile_task_data 1 object, 80 bytes</span>
<span class="plain-syntax"> ---- article 2 objects, 80 bytes</span>
<span class="plain-syntax"> ---- group_together_function 2 objects, 80 bytes</span>
<span class="plain-syntax"> ---- build_methodology 1 object, 56 bytes</span>
<span class="plain-syntax"> ---- inter_warehouse 1 object, 56 bytes</span>
<span class="plain-syntax"> ---- build_methodology 1 object, 56 bytes</span>
<span class="plain-syntax"> ---- figures_data 1 object, 56 bytes</span>
<span class="plain-syntax"> ---- star_invention 1 object, 48 bytes</span>
<span class="plain-syntax"> ---- HTML_file_state 1 object, 48 bytes</span>
<span class="plain-syntax"> ---- star_invention 1 object, 48 bytes</span>
<span class="plain-syntax"> ---- loop_over_scope 1 object, 40 bytes</span>
<span class="plain-syntax"> ---- kind_template_definition 1 object, 40 bytes</span>
<span class="plain-syntax"> ---- by_function_bp_data 1 object, 40 bytes</span>
<span class="plain-syntax"> ---- loop_over_scope 1 object, 40 bytes</span>
<span class="plain-syntax"> ---- I6_generation_data 1 object, 24 bytes</span>
<span class="plain-syntax">39.6% was used for memory not allocated for objects:</span>
<span class="plain-syntax">38.4% was used for memory not allocated for objects:</span>
<span class="plain-syntax"> 21.1% text stream storage 86233212 bytes in 530551 claims</span>
<span class="plain-syntax"> 4.4% dictionary storage 18153984 bytes in 33230 claims</span>
<span class="plain-syntax"> 19.1% text stream storage 75429500 bytes in 530079 claims</span>
<span class="plain-syntax"> 4.6% dictionary storage 18098176 bytes in 33115 claims</span>
<span class="plain-syntax"> ---- sorting 744 bytes in 3 claims</span>
<span class="plain-syntax"> 1.7% source text 7200000 bytes in 3 claims</span>
<span class="plain-syntax"> 2.6% source text details 10800000 bytes in 2 claims</span>
<span class="plain-syntax"> 1.8% source text 7200000 bytes in 3 claims</span>
<span class="plain-syntax"> 2.7% source text details 10800000 bytes in 2 claims</span>
<span class="plain-syntax"> ---- documentation fragments 262144 bytes in 1 claim</span>
<span class="plain-syntax"> ---- linguistic stock array 81920 bytes in 2 claims</span>
<span class="plain-syntax"> ---- small word set array 105600 bytes in 22 claims</span>
<span class="plain-syntax"> 1.0% inter symbols storage 4170224 bytes in 27665 claims</span>
<span class="plain-syntax"> 4.1% inter bytecode storage 16802808 bytes in 14 claims</span>
<span class="plain-syntax"> 3.9% inter links storage 16174208 bytes in 266 claims</span>
<span class="plain-syntax"> 1.0% inter symbols storage 4157936 bytes in 27546 claims</span>
<span class="plain-syntax"> 4.2% inter bytecode storage 16802804 bytes in 14 claims</span>
<span class="plain-syntax"> 4.1% inter links storage 16174208 bytes in 266 claims</span>
<span class="plain-syntax"> ---- inter tree location list storage 191232 bytes in 32 claims</span>
<span class="plain-syntax"> 0.4% instance-of-kind counting 1695204 bytes in 1 claim</span>
<span class="plain-syntax"> ---- compilation workspace for objects 21856 bytes in 25 claims</span>
<span class="plain-syntax"> ---- lists for type-checking invocations 16000 bytes in 1 claim</span>
<span class="plain-syntax"> ---- code generation workspace for objects 9648 bytes in 9 claims</span>
<span class="plain-syntax"> ---- emitter array storage 161920 bytes in 2064 claims</span>
<span class="plain-syntax"> ---- code generation workspace for objects 9600 bytes in 9 claims</span>
<span class="plain-syntax"> ---- emitter array storage 160512 bytes in 2042 claims</span>
<span class="plain-syntax">18.7% was overhead - 76758888 bytes = 74959K = 73 MB</span>
<span class="plain-syntax">18.4% was overhead - 72309928 bytes = 70615K = 68 MB</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Preform grammar. </b>The full annotated description of the Preform grammar (see <a href="../words-module/4-ap.html" class="internal">About Preform (in words)</a>),
with optimisation details and hit/miss statistics added, is also long: it's
@ -394,31 +391,31 @@ sample, showing the nonterminal used to parse literals in Inform 7 source text:
</p>
<pre class="undisplayed-code all-displayed-code code-font">
<span class="plain-syntax">&lt;s-literal&gt; hits 2097/23838 nti 14 constraint (none) extremes [1, infinity)</span>
<span class="plain-syntax">&lt;s-literal&gt; hits 2075/23610 nti 14 constraint (none) extremes [1, infinity)</span>
<span class="plain-syntax"> English:</span>
<span class="plain-syntax"> (@1)&lt;cardinal-number&gt;=1 </span>
<span class="plain-syntax"> (hits 171/171) (matched: '100') constraint CS = {r0} extremes [1, 1]</span>
<span class="plain-syntax"> (hits 160/160) (matched: '100') constraint CS = {r0} extremes [1, 1]</span>
<span class="plain-syntax"> (@1)minus (@2)&lt;cardinal-number&gt;=1 </span>
<span class="plain-syntax"> (hits 0/1806) constraint DS = {14} extremes [2, 2]</span>
<span class="plain-syntax"> (hits 0/1798) constraint DS = {14} extremes [2, 2]</span>
<span class="plain-syntax"> (@1)&lt;quoted-text&gt;=1 (@2)( (@3)&lt;response-letter&gt;=2 (@4)) </span>
<span class="plain-syntax"> (hits 273/830) (matched: '"[current item from the multiple object list]: [run paragraph on]" ( a )') constraint DS = {14} extremes [4, 4]</span>
<span class="plain-syntax"> (@1)&lt;quoted-text&gt;=1 </span>
<span class="plain-syntax"> (hits 1564/5543) (matched: 'Represents geographical locations, both indoor</span>
<span class="plain-syntax"> (hits 1564/5532) (matched: 'Represents geographical locations, both indoor</span>
<span class="plain-syntax"> and outdoor, which are not necessarily areas in a building. A player in one</span>
<span class="plain-syntax"> room is mostly unable to sense, or interact with, anything in a different room.</span>
<span class="plain-syntax"> Rooms are arranged in a map.') constraint (none) extremes [1, 1]</span>
<span class="plain-syntax"> &lt;s-literal-real-number&gt;=1 </span>
<span class="plain-syntax"> (hits 11/9911) (matched: 'plus infinity') constraint (none) extremes [1, infinity)</span>
<span class="plain-syntax"> (hits 0/9808) constraint (none) extremes [1, infinity)</span>
<span class="plain-syntax"> (@1)&lt;s-literal-truth-state&gt;=1 </span>
<span class="plain-syntax"> (hits 78/196) (matched: 'false') constraint CS = {8} extremes [1, 1]</span>
<span class="plain-syntax"> &lt;s-literal-list&gt;=1 </span>
<span class="plain-syntax"> (hits 0/3281) constraint DS = {10} extremes [2, infinity)</span>
<span class="plain-syntax"> (hits 0/3197) constraint DS = {10} extremes [2, infinity)</span>
<span class="plain-syntax"> (@1)unicode &lt;s-unicode-character&gt;=1 </span>
<span class="plain-syntax"> (hits 0/4183) constraint DS = {14} extremes [2, infinity)</span>
<span class="plain-syntax"> (hits 0/4175) constraint DS = {14} extremes [2, infinity)</span>
<span class="plain-syntax"> &lt;s-literal-time&gt;=1 </span>
<span class="plain-syntax"> (hits 0/3738) constraint DW = {11, 12, 13} extremes [2, 5]</span>
<span class="plain-syntax"> &lt;s-literal-unit-notation&gt;=1 </span>
<span class="plain-syntax"> (hits 0/9822) constraint (none) extremes [1, infinity)</span>
<span class="plain-syntax"> (hits 0/9730) constraint (none) extremes [1, infinity)</span>
</pre>
<p class="commentary">The unabridged grammar is here:
</p>
@ -428,7 +425,7 @@ sample, showing the nonterminal used to parse literals in Inform 7 source text:
<a href="preform-diagnostics.txt" download>
<button class="download-button">
<img src="../docs-assets/download.png" alt="download icon" height=16 width=16>
Download <b>preform-diagnostics.txt</b> (Preform diagnostics file, 391.1kB)
Download <b>preform-diagnostics.txt</b> (Preform diagnostics file, 390.6kB)
</button>
</a>
</p>
@ -473,8 +470,8 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'asking for information'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'out of world'</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out asking for information' {unit: 4} {imperative definition: 798}</span>
<span class="plain-syntax"> IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 799}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out asking for information' {unit: 4} {imperative definition: 756}</span>
<span class="plain-syntax"> IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 757}</span>
<span class="plain-syntax"> HEADING_NT'section 1 - errands' {heading 5} {under: H5'section 1 - errands'} {unit: 4}</span>
<span class="plain-syntax"> SENTENCE_NT'the current actor is a person which varies' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
@ -484,8 +481,8 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'current owner' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: NONLOCAL_VARIABLE_NT'current owner' {nonlocal: 'current owner'(var)person}} {created here}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'person which varies' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values variable-pointer'-k} {creation: &lt;&lt; kind=people variable-pointer(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 800}</span>
<span class="plain-syntax"> IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 801}</span>
<span class="plain-syntax"> IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 758}</span>
<span class="plain-syntax"> IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 759}</span>
<span class="plain-syntax"> SENTENCE_NT'a person can be active or passive' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'can be' {verb 'be able to be' s/p 3p act IS_TENSE +ve} {special meaning: can-be}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'a person' {refined} {refers: infs'person'} {creation: &lt;&lt; kind=person(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
@ -501,34 +498,34 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'are' {verb 'be' 3p p act IS_TENSE +ve}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'character movement rules' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT {kind: rulebook} {rulebook: character movement}} {created here}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'rulebook' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values based rulebook producing values'-k} {creation: &lt;&lt; kind=rulebook(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'the first character movement rule' {unit: 4} {imperative definition: 802}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a character movement rule' {unit: 4} {imperative definition: 803}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a character movement rule' {unit: 4} {imperative definition: 804}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to decide whether movement has not yet occurred' {unit: 4} {imperative definition: 805}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 806}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 807}</span>
<span class="plain-syntax"> IMPERATIVE_NT'the first character movement rule' {unit: 4} {imperative definition: 760}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a character movement rule' {unit: 4} {imperative definition: 761}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a character movement rule' {unit: 4} {imperative definition: 762}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to decide whether movement has not yet occurred' {unit: 4} {imperative definition: 763}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 764}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 765}</span>
<span class="plain-syntax"> SENTENCE_NT'the shopowner rules is a rulebook' {unit: 4} {classified} {clears pronouns}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'shopowner rules' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT {kind: rulebook} {rulebook: shopowner}} {created here}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'rulebook' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values based rulebook producing values'-k} {creation: &lt;&lt; kind=rulebook(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a shopowner rule' {unit: 4} {imperative definition: 808}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone closing a door when the person asked owns the' {unit: 4} {imperative definition: 809}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report vanessa closing the metal door when the metal door is' {unit: 4} {imperative definition: 810}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a shopowner rule' {unit: 4} {imperative definition: 811}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a shopowner rule' {unit: 4} {imperative definition: 766}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone closing a door when the person asked owns the' {unit: 4} {imperative definition: 767}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report vanessa closing the metal door when the metal door is' {unit: 4} {imperative definition: 768}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a shopowner rule' {unit: 4} {imperative definition: 769}</span>
<span class="plain-syntax"> SENTENCE_NT'filing is an action applying to one thing' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'filing'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'applying to one thing'</span>
<span class="plain-syntax"> IMPERATIVE_NT'before someone filing something which is not carried by the ' {unit: 4} {imperative definition: 812}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone filing' {unit: 4} {imperative definition: 813}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone filing' {unit: 4} {imperative definition: 814}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before someone filing something which is not carried by the ' {unit: 4} {imperative definition: 770}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone filing' {unit: 4} {imperative definition: 771}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone filing' {unit: 4} {imperative definition: 772}</span>
<span class="plain-syntax"> SENTENCE_NT'the shopper rules is a rulebook' {unit: 4} {classified} {clears pronouns}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'shopper rules' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT {kind: rulebook} {rulebook: shopper}} {created here}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'rulebook' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values based rulebook producing values'-k} {creation: &lt;&lt; kind=rulebook(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a shopper rule' {unit: 4} {imperative definition: 815}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a shopper rule' {unit: 4} {imperative definition: 816}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 817}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a shopper rule' {unit: 4} {imperative definition: 773}</span>
<span class="plain-syntax"> IMPERATIVE_NT'a shopper rule' {unit: 4} {imperative definition: 774}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 775}</span>
<span class="plain-syntax"> DEFN_CONT_NT'a room is air-conditioned' {unit: 4}</span>
<span class="plain-syntax"> CODE_BLOCK_NT</span>
<span class="plain-syntax"> CODE_BLOCK_NT {control structure: IF}</span>
@ -586,8 +583,8 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> COMMON_NOUN_NT'artwork' {indefinite 'an' n/m/f nom/acc s} {refined} {creation: &lt;&lt; kind=artwork(x) &gt;&gt;} {refers: infs'artwork'} {eval: TEST_VALUE_NT} {created here}</span>
<span class="plain-syntax"> KIND_NT'kind of thing' {refined} {refers: infs'thing'}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'thing' {refined} {refers: infs'thing'} {creation: &lt;&lt; kind=thing(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before printing the name of an artwork' {unit: 4} {imperative definition: 818}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after printing the name of an artwork' {unit: 4} {imperative definition: 819}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before printing the name of an artwork' {unit: 4} {imperative definition: 776}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after printing the name of an artwork' {unit: 4} {imperative definition: 777}</span>
<span class="plain-syntax"> SENTENCE_NT'an artwork can be submitted or reserved' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'can be' {verb 'be able to be' s/p 3p act IS_TENSE +ve} {special meaning: can-be}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'an artwork' {refined} {refers: infs'artwork'} {creation: &lt;&lt; kind=artwork(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
@ -600,49 +597,49 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> COMMON_NOUN_NT'book' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: &lt;&lt; kind=book(x) &gt;&gt;} {refers: infs'book'} {eval: TEST_VALUE_NT} {created here}</span>
<span class="plain-syntax"> KIND_NT'kind of artwork' {refined} {refers: infs'artwork'}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'artwork' {refined} {refers: infs'artwork'} {creation: &lt;&lt; kind=artwork(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before someone resolving a book when the person asked is not' {unit: 4} {imperative definition: 820}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone resolving a book' {unit: 4} {imperative definition: 821}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone resolving a book' {unit: 4} {imperative definition: 822}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before listing contents' {unit: 4} {imperative definition: 823}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before grouping together books' {unit: 4} {imperative definition: 824}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before someone resolving a book when the person asked is not' {unit: 4} {imperative definition: 778}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone resolving a book' {unit: 4} {imperative definition: 779}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone resolving a book' {unit: 4} {imperative definition: 780}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before listing contents' {unit: 4} {imperative definition: 781}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before grouping together books' {unit: 4} {imperative definition: 782}</span>
<span class="plain-syntax"> SENTENCE_NT'a stamped envelope is a kind of thing' {unit: 4} {classified} {interpretation of subject: infs'book'}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'stamped envelope' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: &lt;&lt; kind=stamped envelope(x) &gt;&gt;} {refers: infs'stamped envelope'} {eval: TEST_VALUE_NT} {created here}</span>
<span class="plain-syntax"> KIND_NT'kind of thing' {refined} {refers: infs'thing'}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'thing' {refined} {refers: infs'thing'} {creation: &lt;&lt; kind=thing(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before someone resolving a stamped envelope when the person ' {unit: 4} {imperative definition: 825}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone resolving a stamped envelope' {unit: 4} {imperative definition: 826}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone resolving a stamped envelope' {unit: 4} {imperative definition: 827}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of someone resolving a stamped envelope when the per' {unit: 4} {imperative definition: 828}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before someone resolving a stamped envelope when the person ' {unit: 4} {imperative definition: 783}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone resolving a stamped envelope' {unit: 4} {imperative definition: 784}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone resolving a stamped envelope' {unit: 4} {imperative definition: 785}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of someone resolving a stamped envelope when the per' {unit: 4} {imperative definition: 786}</span>
<span class="plain-syntax"> SENTENCE_NT'a dvd is a kind of artwork' {unit: 4} {classified} {interpretation of subject: infs'stamped envelope'}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'dvd' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: &lt;&lt; kind=dvd(x) &gt;&gt;} {refers: infs'dvd'} {eval: TEST_VALUE_NT} {created here}</span>
<span class="plain-syntax"> KIND_NT'kind of artwork' {refined} {refers: infs'artwork'}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'artwork' {refined} {refers: infs'artwork'} {creation: &lt;&lt; kind=artwork(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before someone resolving a dvd when the person asked is not ' {unit: 4} {imperative definition: 829}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone resolving a dvd' {unit: 4} {imperative definition: 830}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone resolving a dvd' {unit: 4} {imperative definition: 831}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of someone resolving a dvd when the person asked car' {unit: 4} {imperative definition: 832}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before listing contents' {unit: 4} {imperative definition: 833}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before grouping together dvds' {unit: 4} {imperative definition: 834}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before someone resolving a dvd when the person asked is not ' {unit: 4} {imperative definition: 787}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone resolving a dvd' {unit: 4} {imperative definition: 788}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone resolving a dvd' {unit: 4} {imperative definition: 789}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of someone resolving a dvd when the person asked car' {unit: 4} {imperative definition: 790}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before listing contents' {unit: 4} {imperative definition: 791}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before grouping together dvds' {unit: 4} {imperative definition: 792}</span>
<span class="plain-syntax"> SENTENCE_NT'approaching is an action applying to one thing' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'approaching'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'applying to one thing'</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone approaching' {unit: 4} {imperative definition: 835}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone approaching' {unit: 4} {imperative definition: 793}</span>
<span class="plain-syntax"> SENTENCE_NT'a coupon is a kind of thing' {unit: 4} {classified} {interpretation of subject: infs'dvd'}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'coupon' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: &lt;&lt; kind=coupon(x) &gt;&gt;} {refers: infs'coupon'} {eval: TEST_VALUE_NT} {created here}</span>
<span class="plain-syntax"> KIND_NT'kind of thing' {refined} {refers: infs'thing'}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'thing' {refined} {refers: infs'thing'} {creation: &lt;&lt; kind=thing(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone resolving a coupon' {unit: 4} {imperative definition: 836}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone resolving a coupon' {unit: 4} {imperative definition: 794}</span>
<span class="plain-syntax"> SENTENCE_NT'the block giving rule is not listed in any rulebook' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {rule placement sense: negative} {special meaning: rule-listed-in}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'the block giving rule'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'in any rulebook'</span>
<span class="plain-syntax"> IMPERATIVE_NT'check giving something to someone ( this is the block player' {unit: 4} {imperative definition: 837}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before someone resolving a coupon when the person asked is n' {unit: 4} {imperative definition: 838}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after someone giving a coupon to vanessa' {unit: 4} {imperative definition: 839}</span>
<span class="plain-syntax"> IMPERATIVE_NT'check giving something to someone ( this is the block player' {unit: 4} {imperative definition: 795}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before someone resolving a coupon when the person asked is n' {unit: 4} {imperative definition: 796}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after someone giving a coupon to vanessa' {unit: 4} {imperative definition: 797}</span>
<span class="plain-syntax"> SENTENCE_NT'infection color is a kind of value' {unit: 4} {classified} {interpretation of subject: infs'coupon'}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'infection color' {refined} {creation: &lt;&lt; kind=infection color(x) &gt;&gt;} {refers: infs'object'-k} {eval: TEST_VALUE_NT} {created here}</span>
@ -702,7 +699,7 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> AND_NT',' {refined}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'saffron silk' {refined} {refers: infs'saffron silk'} {eval: CONSTANT_NT'saffron silk' {kind: infection color} {instance: I86'saffron silk'[infection color]} {enumeration: 25}} {created here}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'cookie dough cream' {refined} {refers: infs'cookie dough cream'} {eval: CONSTANT_NT'cookie dough cream' {kind: infection color} {instance: I87'cookie dough cream'[infection color]} {enumeration: 26}} {created here}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to say list of flavors' {unit: 4} {imperative definition: 840}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to say list of flavors' {unit: 4} {imperative definition: 798}</span>
<span class="plain-syntax"> SENTENCE_NT'understand "ask vanessa for [flavored ice cream]" as buying ' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'"ask vanessa for [flavored ice cream]"'</span>
@ -715,8 +712,8 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'buying the flavor'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'applying to one infection color'</span>
<span class="plain-syntax"> IMPERATIVE_NT'check buying the flavor' {unit: 4} {imperative definition: 841}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out buying the flavor' {unit: 4} {imperative definition: 842}</span>
<span class="plain-syntax"> IMPERATIVE_NT'check buying the flavor' {unit: 4} {imperative definition: 799}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out buying the flavor' {unit: 4} {imperative definition: 800}</span>
<span class="plain-syntax"> SENTENCE_NT'understand "ice cream" or "cream" or "ice" or "sherbet" or "' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'"ice cream" or "cream" or "ice" or "sherbet" or "sorbet"'</span>
@ -750,12 +747,12 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'the infection color property'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'referring to an ice cream cone'</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone resolving an ice cream cone' {unit: 4} {imperative definition: 843}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of someone eating a fresh ice cream cone' {unit: 4} {imperative definition: 844}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone eating an ice cream cone' {unit: 4} {imperative definition: 845}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before printing the name of an ice cream cone' {unit: 4} {imperative definition: 846}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone resolving an ice cream cone' {unit: 4} {imperative definition: 801}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of someone eating a fresh ice cream cone' {unit: 4} {imperative definition: 802}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone eating an ice cream cone' {unit: 4} {imperative definition: 803}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before printing the name of an ice cream cone' {unit: 4} {imperative definition: 804}</span>
<span class="plain-syntax"> HEADING_NT'section 2 - infection rules' {heading 5} {under: H5'section 2 - infection rules'} {unit: 4}</span>
<span class="plain-syntax"> IMPERATIVE_NT'this is the infection rule' {unit: 4} {imperative definition: 847}</span>
<span class="plain-syntax"> IMPERATIVE_NT'this is the infection rule' {unit: 4} {imperative definition: 805}</span>
<span class="plain-syntax"> SENTENCE_NT'a person can be infected or clean' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'can be' {verb 'be able to be' s/p 3p act IS_TENSE +ve} {special meaning: can-be}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'a person' {refined} {refers: infs'person'} {creation: &lt;&lt; kind=person(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
@ -768,11 +765,11 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> COMMON_NOUN_NT'person' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'person'} {creation: &lt;&lt; kind=person(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> ALLOWED_NT'has' {refined}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'infection color' {indefinite 'an' n/m/f nom/acc s} {refined}</span>
<span class="plain-syntax"> IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 848}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 849}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 850}</span>
<span class="plain-syntax"> IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 851}</span>
<span class="plain-syntax"> IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 852}</span>
<span class="plain-syntax"> IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 806}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 807}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 808}</span>
<span class="plain-syntax"> IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 809}</span>
<span class="plain-syntax"> IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 810}</span>
<span class="plain-syntax"> SENTENCE_NT'understand "sneeze on [something]" as sneezing on' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'"sneeze on [something]"'</span>
@ -781,11 +778,11 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'sneezing on'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'applying to one thing'</span>
<span class="plain-syntax"> IMPERATIVE_NT'check sneezing on' {unit: 4} {imperative definition: 853}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out sneezing on' {unit: 4} {imperative definition: 854}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone sneezing on' {unit: 4} {imperative definition: 855}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report sneezing on' {unit: 4} {imperative definition: 856}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone sneezing on' {unit: 4} {imperative definition: 857}</span>
<span class="plain-syntax"> IMPERATIVE_NT'check sneezing on' {unit: 4} {imperative definition: 811}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out sneezing on' {unit: 4} {imperative definition: 812}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out someone sneezing on' {unit: 4} {imperative definition: 813}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report sneezing on' {unit: 4} {imperative definition: 814}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone sneezing on' {unit: 4} {imperative definition: 815}</span>
<span class="plain-syntax"> SENTENCE_NT'understand "inject [someone] with [something]" as injecting ' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'"inject [someone] with [something]"'</span>
@ -806,10 +803,10 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'injecting it with'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'applying to two things'</span>
<span class="plain-syntax"> IMPERATIVE_NT'check injecting it with' {unit: 4} {imperative definition: 858}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out injecting it with' {unit: 4} {imperative definition: 859}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after injecting the player with something' {unit: 4} {imperative definition: 860}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report injecting it with' {unit: 4} {imperative definition: 861}</span>
<span class="plain-syntax"> IMPERATIVE_NT'check injecting it with' {unit: 4} {imperative definition: 816}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out injecting it with' {unit: 4} {imperative definition: 817}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after injecting the player with something' {unit: 4} {imperative definition: 818}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report injecting it with' {unit: 4} {imperative definition: 819}</span>
<span class="plain-syntax"> HEADING_NT'section 3 - geography' {heading 5} {under: H5'section 3 - geography'} {unit: 4}</span>
<span class="plain-syntax"> INCLUSION_NT'include locksmith by emily short' {unit: 4}</span>
<span class="plain-syntax"> HEADING_NT'version 12 of locksmith by emily short begins here' {heading 0} {under: H0'version 12 of locksmith by emily short begins here'} {includes: Locksmith by Emily Short v12 } {unit: 3}</span>
@ -834,9 +831,9 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'going toward'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'applying to one thing'</span>
<span class="plain-syntax"> IMPERATIVE_NT'check going toward' {unit: 4} {imperative definition: 899}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out going toward' {unit: 4} {imperative definition: 900}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of waiting when the destination of the player is not' {unit: 4} {imperative definition: 901}</span>
<span class="plain-syntax"> IMPERATIVE_NT'check going toward' {unit: 4} {imperative definition: 857}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out going toward' {unit: 4} {imperative definition: 858}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of waiting when the destination of the player is not' {unit: 4} {imperative definition: 859}</span>
<span class="plain-syntax"> SENTENCE_NT'understand "stop" or "cease" as stopping' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'"stop" or "cease"'</span>
@ -845,11 +842,11 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'stopping'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'applying to nothing'</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out stopping' {unit: 4} {imperative definition: 902}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report stopping' {unit: 4} {imperative definition: 903}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after going to an air-conditioned room' {unit: 4} {imperative definition: 904}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after going from an air-conditioned room' {unit: 4} {imperative definition: 905}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of listening to an air-conditioned room' {unit: 4} {imperative definition: 906}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out stopping' {unit: 4} {imperative definition: 860}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report stopping' {unit: 4} {imperative definition: 861}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after going to an air-conditioned room' {unit: 4} {imperative definition: 862}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after going from an air-conditioned room' {unit: 4} {imperative definition: 863}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of listening to an air-conditioned room' {unit: 4} {imperative definition: 864}</span>
<span class="plain-syntax"> SENTENCE_NT'the alfred cralle pool hall is a room' {unit: 4} {classified} {interpretation of subject: infs'person'}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'alfred cralle pool hall' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'alfred cralle pool hall'} {eval: CONSTANT_NT'alfred cralle pool hall' {kind: object} {instance: I88'alfred cralle pool hall'} {enumeration: 0}} {created here}</span>
@ -891,7 +888,7 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> PROPER_NOUN_NT'felt door' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'felt door'} {eval: CONSTANT_NT'felt door' {kind: door} {instance: I90'felt door'} {enumeration: 0}}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'description' {refined} {eval: CONSTANT_NT {kind: texts valued property} {property: 'description'=text}}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'"It has a prominent lock, designed for an old-fashioned key.' {refined} {eval: CONSTANT_NT'"It has a prominent lock, designed for an old-fashioned key.' {kind: text}}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after locking a door with something in the presence of an ot' {unit: 4} {imperative definition: 907}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after locking a door with something in the presence of an ot' {unit: 4} {imperative definition: 865}</span>
<span class="plain-syntax"> SENTENCE_NT'nancy johnson memorial square is west of the felt door' {unit: 4} {classified} {interpretation of subject: infs'key to the city'}</span>
<span class="plain-syntax"> VERB_NT'is west of' {verb 'be' 3p s act IS_TENSE +ve} {prep1: west of}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'nancy johnson memorial square' {refined} {refers: infs'nancy johnson memorial square'} {eval: CONSTANT_NT'nancy johnson memorial square' {kind: object} {instance: I92'nancy johnson memorial square'} {enumeration: 0}} {created here}</span>
@ -953,8 +950,8 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'slot' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'slot'} {eval: CONSTANT_NT'slot' {kind: object} {instance: I97'slot'} {enumeration: 0}}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'container' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'container'} {creation: &lt;&lt; kind=container(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out inserting something into the slot' {unit: 4} {imperative definition: 908}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report inserting something into the slot' {unit: 4} {imperative definition: 909}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out inserting something into the slot' {unit: 4} {imperative definition: 866}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report inserting something into the slot' {unit: 4} {imperative definition: 867}</span>
<span class="plain-syntax"> SENTENCE_NT'hamwi street is northeast of an iron gate' {unit: 4} {classified} {interpretation of subject: infs'slot'}</span>
<span class="plain-syntax"> VERB_NT'is northeast of' {verb 'be' 3p s act IS_TENSE +ve} {prep1: northeast of}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'hamwi street' {refined} {refers: infs'hamwi street'} {eval: CONSTANT_NT'hamwi street' {kind: object} {instance: I98'hamwi street'} {enumeration: 0}} {created here}</span>
@ -978,7 +975,7 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> AND_NT'and' {refined}</span>
<span class="plain-syntax"> ADJECTIVE_NT'lockable' {refined} {predicate: lockable} {creation: &lt;&lt; lockable(x) ^ lockable(x) &gt;&gt;}</span>
<span class="plain-syntax"> ADJECTIVE_NT'unlocked' {refined} {predicate: unlocked} {creation: &lt;&lt; unlocked(x) ^ unlocked(x) &gt;&gt;}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before printing the name of the iron gate while not opening ' {unit: 4} {imperative definition: 910}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before printing the name of the iron gate while not opening ' {unit: 4} {imperative definition: 868}</span>
<span class="plain-syntax"> SENTENCE_NT'cold comfort ice cream is north of a metal door' {unit: 4} {classified} {interpretation of subject: infs'iron gate'}</span>
<span class="plain-syntax"> VERB_NT'is north of' {verb 'be' 3p s act IS_TENSE +ve} {prep1: north of}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'cold comfort ice cream' {refined} {refers: infs'cold comfort ice cream'} {eval: CONSTANT_NT'cold comfort ice cream' {kind: object} {instance: I100'cold comfort ice cream'} {enumeration: 0}} {created here}</span>
@ -1084,8 +1081,8 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'"glass"'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'the box'</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of attacking the closed emergency box' {unit: 4} {imperative definition: 911}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of attacking the open emergency box' {unit: 4} {imperative definition: 912}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of attacking the closed emergency box' {unit: 4} {imperative definition: 869}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of attacking the open emergency box' {unit: 4} {imperative definition: 870}</span>
<span class="plain-syntax"> SENTENCE_NT'the syringe is in the emergency box' {unit: 4} {classified} {interpretation of subject: infs'emergency box'}</span>
<span class="plain-syntax"> VERB_NT'is in' {verb 'be' 3p s act IS_TENSE +ve} {prep1: in}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'syringe' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'syringe'} {eval: CONSTANT_NT'syringe' {kind: object} {instance: I109'syringe'} {enumeration: 0}} {created here}</span>
@ -1188,8 +1185,8 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> SENTENCE_NT'use full-length room descriptions' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'use' {verb 'use' 3p p act IS_TENSE +ve} {special meaning: use}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'full-length room descriptions'</span>
<span class="plain-syntax"> IMPERATIVE_NT'after looking in an outdoors room' {unit: 4} {imperative definition: 913}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 914}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after looking in an outdoors room' {unit: 4} {imperative definition: 871}</span>
<span class="plain-syntax"> IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 872}</span>
<span class="plain-syntax"> DEFN_CONT_NT'a door is proximate' {unit: 4}</span>
<span class="plain-syntax"> CODE_BLOCK_NT</span>
<span class="plain-syntax"> CODE_BLOCK_NT {control structure: IF}</span>
@ -1210,7 +1207,7 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> INVOCATION_NT'yes' {phrase invoked: &lt;no-inter-name&gt;}</span>
<span class="plain-syntax"> INVOCATION_LIST_NT'no' {unit: 4}</span>
<span class="plain-syntax"> INVOCATION_NT'no' {phrase invoked: &lt;no-inter-name&gt;}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before exiting when the player is in an indoors room' {unit: 4} {imperative definition: 915}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before exiting when the player is in an indoors room' {unit: 4} {imperative definition: 873}</span>
<span class="plain-syntax"> SENTENCE_NT'blank is a room' {unit: 4} {classified} {interpretation of subject: infs'key to the city'}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'blank' {refined} {refers: infs'blank'} {eval: CONSTANT_NT'blank' {kind: object} {instance: I113'blank'} {enumeration: 0}} {created here}</span>
@ -1436,15 +1433,15 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> PROPER_NOUN_NT'ned' {refined} {refers: infs'ned'} {eval: CONSTANT_NT'ned' {kind: man} {instance: I166'ned'} {enumeration: 0}}</span>
<span class="plain-syntax"> RELATIONSHIP_NT'owns' {meaning: ownership-r} {refined}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'movie rental' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'movie rental store'} {eval: CONSTANT_NT'movie rental store' {kind: object} {instance: I104'movie rental store'} {enumeration: 0}}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after printing the name of someone ( called target ) while l' {unit: 4} {imperative definition: 916}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after printing the name of someone ( called target ) while l' {unit: 4} {imperative definition: 874}</span>
<span class="plain-syntax"> SENTENCE_NT'the description of a person is usually "[The noun] [if the n' {unit: 4} {classified} {interpretation of subject: infs'ned'}</span>
<span class="plain-syntax"> VERB_NT'is usually' {certainty:likely} {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> X_OF_Y_NT'description of a person' {definite 'the' n/m/f s/p nom/acc} {refined}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'person' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'person'} {creation: &lt;&lt; kind=person(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'description' {refined} {eval: CONSTANT_NT {kind: texts valued property} {property: 'description'=text}}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'"[The noun] [if the noun is clean]looks healthy[otherwise]is' {refined} {eval: CONSTANT_NT'"[The noun] [if the noun is clean]looks healthy[otherwise]is' {kind: text}}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after examining another person who is carrying something' {unit: 4} {imperative definition: 917}</span>
<span class="plain-syntax"> IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 918}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after examining another person who is carrying something' {unit: 4} {imperative definition: 875}</span>
<span class="plain-syntax"> IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 876}</span>
<span class="plain-syntax"> HEADING_NT'section 5 - conversation' {heading 5} {under: H5'section 5 - conversation'} {unit: 4}</span>
<span class="plain-syntax"> SENTENCE_NT'a person has a table name called conversation' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'has' {verb 'have' 3p s act IS_TENSE +ve}</span>
@ -1453,8 +1450,8 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> PROPERTYCALLED_NT'called'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'table name' {indefinite 'a' n/m/f nom/acc s}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'conversation'</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of asking someone about something' {unit: 4} {imperative definition: 919}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of telling someone about something' {unit: 4} {imperative definition: 920}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of asking someone about something' {unit: 4} {imperative definition: 877}</span>
<span class="plain-syntax"> IMPERATIVE_NT'instead of telling someone about something' {unit: 4} {imperative definition: 878}</span>
<span class="plain-syntax"> SENTENCE_NT'understand "recap" or "recall" or "review" as recalling conv' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'"recap" or "recall" or "review"'</span>
@ -1463,7 +1460,7 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'recalling conversations'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'applying to nothing'</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out recalling conversations' {unit: 4} {imperative definition: 921}</span>
<span class="plain-syntax"> IMPERATIVE_NT'carry out recalling conversations' {unit: 4} {imperative definition: 879}</span>
<span class="plain-syntax"> SENTENCE_NT'the conversation of a person is usually table of general chi' {unit: 4} {classified} {interpretation of subject: infs'person'}</span>
<span class="plain-syntax"> VERB_NT'is usually' {certainty:likely} {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> X_OF_Y_NT'conversation of a person' {definite 'the' n/m/f s/p nom/acc} {refined}</span>
@ -1478,7 +1475,7 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> PROPER_NOUN_NT'conversation' {refined} {eval: CONSTANT_NT {kind: table names valued property} {property: 'conversation'=table name}}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'table of vanessa chatter' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT'table of vanessa chatter' {kind: table name} {table: table_data}{meaning: {table of vanessa chatter = TABLE_MC}}}</span>
<span class="plain-syntax"> TABLE_NT'table of vanessa chatter topic reply summary turn stamp char' {unit: 4}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after reading a command' {unit: 4} {imperative definition: 922}</span>
<span class="plain-syntax"> IMPERATIVE_NT'after reading a command' {unit: 4} {imperative definition: 880}</span>
<span class="plain-syntax"> HEADING_NT'section 6 - movement description' {heading 5} {under: H5'section 6 - movement description'} {unit: 4}</span>
<span class="plain-syntax"> SENTENCE_NT'a person has some text called walk style' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'has' {verb 'have' 3p s act IS_TENSE +ve}</span>
@ -1525,8 +1522,8 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> PROPER_NOUN_NT'"sashay"' {refined} {eval: CONSTANT_NT'"sashay"' {kind: text}}</span>
<span class="plain-syntax"> TABLE_NT'table of visible exits character second third heading chosen' {unit: 4}</span>
<span class="plain-syntax"> TABLE_NT'table of visible entrances character second third heading ch' {unit: 4}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to clear ( current table - a table name )' {unit: 4} {imperative definition: 923}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to tidy departures of ( current table - a table name )' {unit: 4} {imperative definition: 924}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to clear ( current table - a table name )' {unit: 4} {imperative definition: 881}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to tidy departures of ( current table - a table name )' {unit: 4} {imperative definition: 882}</span>
<span class="plain-syntax"> SENTENCE_NT'a door has a person called last opener' {unit: 4} {classified} {interpretation of subject: infs'person'}</span>
<span class="plain-syntax"> VERB_NT'has' {verb 'have' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'door' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'door'} {creation: &lt;&lt; kind=door(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
@ -1534,21 +1531,21 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> PROPERTYCALLED_NT'called'</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'person' {indefinite 'a' n/m/f nom/acc s}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'last opener'</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone opening a door' {unit: 4} {imperative definition: 925}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone going through a door ( called route )' {unit: 4} {imperative definition: 926}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone opening a door' {unit: 4} {imperative definition: 883}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone going through a door ( called route )' {unit: 4} {imperative definition: 884}</span>
<span class="plain-syntax"> SENTENCE_NT'the last thing named is a thing that varies' {unit: 4} {classified} {interpretation of subject: infs'door'}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'last thing named' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: NONLOCAL_VARIABLE_NT'last thing named' {nonlocal: 'last thing named'(var)thing}} {created here}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'thing that varies' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values variable-pointer'-k} {creation: &lt;&lt; kind=things variable-pointer(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before printing the name of something ( called target ) whic' {unit: 4} {imperative definition: 927}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone going a direction' {unit: 4} {imperative definition: 928}</span>
<span class="plain-syntax"> IMPERATIVE_NT'this is the movement reporting rule' {unit: 4} {imperative definition: 929}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to generate descriptions from ( current table - a table name' {unit: 4} {imperative definition: 930}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before printing the name of something ( called target ) whic' {unit: 4} {imperative definition: 885}</span>
<span class="plain-syntax"> IMPERATIVE_NT'report someone going a direction' {unit: 4} {imperative definition: 886}</span>
<span class="plain-syntax"> IMPERATIVE_NT'this is the movement reporting rule' {unit: 4} {imperative definition: 887}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to generate descriptions from ( current table - a table name' {unit: 4} {imperative definition: 888}</span>
<span class="plain-syntax"> SENTENCE_NT'the last person named is a person that varies' {unit: 4} {classified} {interpretation of subject: infs'door'}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'last person named' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: NONLOCAL_VARIABLE_NT'last person named' {nonlocal: 'last person named'(var)person}} {created here}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'person that varies' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values variable-pointer'-k} {creation: &lt;&lt; kind=people variable-pointer(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before printing the name of a person ( called target )' {unit: 4} {imperative definition: 931}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before printing the name of a person ( called target )' {unit: 4} {imperative definition: 889}</span>
<span class="plain-syntax"> SENTENCE_NT'group size is a number that varies' {unit: 4} {classified} {interpretation of subject: infs'door'}</span>
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'group size' {refined} {eval: NONLOCAL_VARIABLE_NT'group size' {nonlocal: 'group size'(var)number}} {created here}</span>
@ -1557,19 +1554,19 @@ that is, with the content of extensions excluded, and with the content of
<span class="plain-syntax"> VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'group size' {refined} {eval: NONLOCAL_VARIABLE_NT'group size' {nonlocal: 'group size'(var)number}{meaning: {group size = VARIABLE_MC}}}</span>
<span class="plain-syntax"> PROPER_NOUN_NT'1' {refined} {eval: CONSTANT_NT'1' {kind: number} {explicit literal} {number: 1}}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to clear marked people' {unit: 4} {imperative definition: 932}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before listing nondescript items' {unit: 4} {imperative definition: 933}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to describe patients' {unit: 4} {imperative definition: 934}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to say ( named character - a man ) as pronoun' {unit: 4} {imperative definition: 935}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to say ( named character - a woman ) as pronoun' {unit: 4} {imperative definition: 936}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to say looks as though dipped in for ( index - a number )' {unit: 4} {imperative definition: 937}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to clear marked people' {unit: 4} {imperative definition: 890}</span>
<span class="plain-syntax"> IMPERATIVE_NT'before listing nondescript items' {unit: 4} {imperative definition: 891}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to describe patients' {unit: 4} {imperative definition: 892}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to say ( named character - a man ) as pronoun' {unit: 4} {imperative definition: 893}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to say ( named character - a woman ) as pronoun' {unit: 4} {imperative definition: 894}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to say looks as though dipped in for ( index - a number )' {unit: 4} {imperative definition: 895}</span>
<span class="plain-syntax"> TABLE_NT'table of dipping phrases dipping "looks as though dipped in"' {unit: 4}</span>
<span class="plain-syntax"> SENTENCE_NT'a door is usually scenery' {unit: 4} {classified} {interpretation of subject: infs'door'}</span>
<span class="plain-syntax"> VERB_NT'is usually' {certainty:likely} {verb 'be' 3p s act IS_TENSE +ve}</span>
<span class="plain-syntax"> COMMON_NOUN_NT'door' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'door'} {creation: &lt;&lt; kind=door(x) &gt;&gt;} {eval: TEST_VALUE_NT}</span>
<span class="plain-syntax"> ADJECTIVE_NT'scenery' {refined} {predicate: scenery} {creation: &lt;&lt; scenery(x) ^ scenery(x) &gt;&gt;}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to make delimiter ( index - a number ) of ( count - a number' {unit: 4} {imperative definition: 938}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to say optional comma' {unit: 4} {imperative definition: 939}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to make delimiter ( index - a number ) of ( count - a number' {unit: 4} {imperative definition: 896}</span>
<span class="plain-syntax"> IMPERATIVE_NT'to say optional comma' {unit: 4} {imperative definition: 897}</span>
<span class="plain-syntax"> SENTENCE_NT'test me with go to cold comfort / z / z / z / z / ask vaness' {unit: 4} {classified}</span>
<span class="plain-syntax"> VERB_NT'test' {verb 'test' 3p p act IS_TENSE +ve} {prep2: with} {special meaning: test-with}</span>
<span class="plain-syntax"> UNPARSED_NOUN_NT'me'</span>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -184,7 +184,7 @@ logging:
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">step</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c+?) *-&gt; *(%c*)"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ST</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">target_argument</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">ST</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">take_target_argument_from_VM</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ST</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">step_argument</span><span class="plain-syntax"> = </span><a href="1-ppl.html#SP3" class="function-link"><span class="function-syntax">CodeGen::Pipeline::read_parameter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[2], </span><span class="identifier-syntax">D</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ST</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">step_argument</span><span class="plain-syntax"> = </span><a href="1-ppl.html#SP3" class="function-link"><span class="function-syntax">CodeGen::Pipeline::read_parameter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1], </span><span class="identifier-syntax">D</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</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">ST</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">step_argument</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="identifier-syntax">Str::copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">step</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0]);</span>
<span class="plain-syntax"> }</span>
@ -360,7 +360,7 @@ logging:
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">VM</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">step</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">take_target_argument_from_VM</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">code_generation_target</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="identifier-syntax">code_generation_target</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">format_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">cgt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">target_name</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">TargetVMs::family</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">), </span><span class="identifier-syntax">cgt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">target_name</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">step</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">target_argument</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cgt</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">step</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">target_argument</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROBLEMS_MODULE</span>

View file

@ -95,33 +95,11 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TargetVMs::debug_enabled</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">)) </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DEBUG_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-gm.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Special constants for Z-machine and Glulx VMs</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TargetVMs::is_16_bit</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="3-gm.html#SP2_2" class="named-paragraph-link"><span class="named-paragraph">16-bit constants</span><span class="named-paragraph-number">2.2</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-gm.html#SP2_3" class="named-paragraph-link"><span class="named-paragraph">32-bit constants</span><span class="named-paragraph-number">2.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TargetVMs::is_16_bit</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="3-gm.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">16-bit constants</span><span class="named-paragraph-number">2.1</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-gm.html#SP2_2" class="named-paragraph-link"><span class="named-paragraph">32-bit constants</span><span class="named-paragraph-number">2.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>&#167;2.1. </b>These constants may be predefined in the veneer of the Inform 6 compiler,
if that is being used further down the compilation chain, but we want to define
them here regardless of that: and then linking can work properly, and the code
will make sense even if I6 is not the final code-generator.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Special constants for Z-machine and Glulx VMs</span><span class="named-paragraph-number">2.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">family_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Z-Machine"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">TARGET_ZCODE_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DICT_WORD_SIZE_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">6</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">family_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Glulx"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">TARGET_GLULX_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DICT_WORD_SIZE_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">9</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INDIV_PROP_START_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-gm.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>&#167;2.2. </b>These constants mostly have obvious meanings, but a few notes:
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>&#167;2.1. </b>These constants mostly have obvious meanings, but a few notes:
</p>
<ul class="items"><li>(1) <span class="extract"><span class="extract-syntax">NULL</span></span>, in our runtime, is -1, and not 0 as it would be in C. This is
@ -137,7 +115,7 @@ That doesn't sound very "fundamental", but in fact it depends on the word
size, because it needs to be a large number but also such that an address
in the VM can be added to it without it becoming negative.
</li></ul>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">16-bit constants</span><span class="named-paragraph-number">2.2</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">16-bit constants</span><span class="named-paragraph-number">2.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -149,9 +127,11 @@ in the VM can be added to it without it becoming negative.
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_hex</span></a><span class="plain-syntax">(</span><span class="constant-syntax">REPARSE_CODE_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">10000</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">MAX_POSITIVE_NUMBER_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">32767</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_signed</span></a><span class="plain-syntax">(</span><span class="constant-syntax">MIN_NEGATIVE_NUMBER_HL</span><span class="plain-syntax">, -32768);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">TARGET_ZCODE_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DICT_WORD_SIZE_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">6</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-gm.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_3" class="paragraph-anchor"></a><b>&#167;2.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">32-bit constants</span><span class="named-paragraph-number">2.3</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>&#167;2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">32-bit constants</span><span class="named-paragraph-number">2.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -163,28 +143,31 @@ in the VM can be added to it without it becoming negative.
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_hex</span></a><span class="plain-syntax">(</span><span class="constant-syntax">REPARSE_CODE_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">0x40000000</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">MAX_POSITIVE_NUMBER_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">2147483647</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_signed</span></a><span class="plain-syntax">(</span><span class="constant-syntax">MIN_NEGATIVE_NUMBER_HL</span><span class="plain-syntax">, -2147483648);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">TARGET_GLULX_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DICT_WORD_SIZE_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">9</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-gm.html#SP3" class="function-link"><span class="function-syntax">GenericModule::emit_one</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INDIV_PROP_START_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-gm.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>Note that all of these constants are made available for linking:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">GenericModule::emit_one</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">GenericModule::emit_one</span></span>:<br/><a href="3-gm.html#SP2">&#167;2</a>, <a href="3-gm.html#SP2_1">&#167;2.1</a>, <a href="3-gm.html#SP2_2">&#167;2.2</a>, <a href="3-gm.html#SP2_3">&#167;2.3</a></span></button><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="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">GenericModule::emit_one</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">GenericModule::emit_one</span></span>:<br/><a href="3-gm.html#SP2">&#167;2</a>, <a href="3-gm.html#SP2_1">&#167;2.1</a>, <a href="3-gm.html#SP2_2">&#167;2.2</a></span></button><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="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</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><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP17" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP9" class="function-link"><span class="function-syntax">Emit::numeric_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">GenericModule::emit_signed</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">GenericModule::emit_signed</span></span>:<br/><a href="3-gm.html#SP2_2">&#167;2.2</a>, <a href="3-gm.html#SP2_3">&#167;2.3</a></span></button><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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">GenericModule::emit_signed</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">GenericModule::emit_signed</span></span>:<br/><a href="3-gm.html#SP2_1">&#167;2.1</a>, <a href="3-gm.html#SP2_2">&#167;2.2</a></span></button><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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</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><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP17" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP9" class="function-link"><span class="function-syntax">Emit::named_numeric_constant_signed</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">GenericModule::emit_hex</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">GenericModule::emit_hex</span></span>:<br/><a href="3-gm.html#SP2_2">&#167;2.2</a>, <a href="3-gm.html#SP2_3">&#167;2.3</a></span></button><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="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">GenericModule::emit_hex</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">GenericModule::emit_hex</span></span>:<br/><a href="3-gm.html#SP2_1">&#167;2.1</a>, <a href="3-gm.html#SP2_2">&#167;2.2</a></span></button><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="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</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><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP17" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP9" class="function-link"><span class="function-syntax">Emit::named_numeric_constant_hex</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">GenericModule::emit_unchecked_hex</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">GenericModule::emit_unchecked_hex</span></span>:<br/><a href="3-gm.html#SP2_2">&#167;2.2</a>, <a href="3-gm.html#SP2_3">&#167;2.3</a></span></button><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="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">GenericModule::emit_unchecked_hex</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">GenericModule::emit_unchecked_hex</span></span>:<br/><a href="3-gm.html#SP2_1">&#167;2.1</a>, <a href="3-gm.html#SP2_2">&#167;2.2</a></span></button><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="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</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><a href="2-hrr.html#SP11" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-hrr.html#SP17" class="function-link"><span class="function-syntax">Hierarchy::make_available</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-emt.html#SP9" class="function-link"><span class="function-syntax">Emit::named_unchecked_constant_hex</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>

View file

@ -416,11 +416,11 @@ line, which is why we couldn't work this out earlier:
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ext</span><span class="plain-syntax"> = </span><span class="identifier-syntax">story_filename_extension</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">ext</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">ext</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"ulx"</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">with_debugging</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">this_is_a_release_compile</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">this_is_a_debug_compile</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">with_debugging</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="1-ic.html#SP9" class="function-link"><span class="function-syntax">Supervisor::set_current_vm</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">TargetVMs::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">ext</span><span class="plain-syntax">, </span><span class="identifier-syntax">with_debugging</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">ext</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">ext</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"Inform6"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="1-ic.html#SP9" class="function-link"><span class="function-syntax">Supervisor::set_current_vm</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">TargetVMs::find_with_hint</span><span class="plain-syntax">(</span><span class="identifier-syntax">ext</span><span class="plain-syntax">, </span><span class="identifier-syntax">with_debugging</span><span class="plain-syntax">));</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="1-ic.html#SP8">&#167;8</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b></p>

View file

@ -101,7 +101,7 @@ if we are running inside <span class="extract"><span class="extract-syntax">info
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">kd</span><span class="plain-syntax">, </span><span class="reserved-syntax">kit_dependency</span><span class="plain-syntax">, </span><span class="identifier-syntax">project</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kits_to_include</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"-kit %S "</span><span class="plain-syntax">, </span><span class="identifier-syntax">kd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kit</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_copy</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">edition</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">work</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">title</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"-format=%S "</span><span class="plain-syntax">, </span><span class="identifier-syntax">TargetVMs::get_unblorbed_extension</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">for_vm</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">command</span><span class="plain-syntax">, </span><span class="string-syntax">"-format=%S "</span><span class="plain-syntax">, </span><span class="identifier-syntax">TargetVMs::get_full_format_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">for_vm</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_nest</span><span class="plain-syntax"> *</span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><a href="5-ps2.html#SP5" class="function-link"><span class="function-syntax">Projects::nest_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">project</span><span class="plain-syntax">);</span>

View file

@ -776,7 +776,7 @@ icon associated with a given minor VM, and explicates what the icons mean:
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">target_vm</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">, </span><span class="identifier-syntax">target_vm</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">VM</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">with_debugging_enabled</span><span class="plain-syntax">) </span><span class="reserved-syntax">continue</span><span class="plain-syntax">; </span><span class="comment-syntax"> avoids listing twice</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TargetVMs::debug_enabled</span><span class="plain-syntax">(</span><span class="identifier-syntax">VM</span><span class="plain-syntax">)) </span><span class="reserved-syntax">continue</span><span class="plain-syntax">; </span><span class="comment-syntax"> avoids listing twice</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">++ &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">", "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="7-ip.html#SP2" class="function-link"><span class="function-syntax">ExtensionIndex::plot_icon</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TargetVMs::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">VM</span><span class="plain-syntax">);</span>

View file

@ -308,11 +308,11 @@ line, which is why we couldn't work this out earlier:
@<Find the virtual machine@> =
text_stream *ext = story_filename_extension;
if (Str::len(ext) == 0) ext = I"ulx";
int with_debugging = FALSE;
if ((this_is_a_release_compile == FALSE) || (this_is_a_debug_compile))
with_debugging = TRUE;
Supervisor::set_current_vm(TargetVMs::find(ext, with_debugging));
if (Str::len(ext) == 0) ext = I"Inform6";
Supervisor::set_current_vm(TargetVMs::find_with_hint(ext, with_debugging));
@ =
target_vm *current_target_VM = NULL;

View file

@ -29,7 +29,7 @@ int Inform7Skill::inform7_via_shell(build_skill *skill, build_step *S,
LOOP_OVER_LINKED_LIST(kd, kit_dependency, project->kits_to_include)
WRITE_TO(command, "-kit %S ", kd->kit->as_copy->edition->work->title);
WRITE_TO(command, "-format=%S ", TargetVMs::get_unblorbed_extension(S->for_vm));
WRITE_TO(command, "-format=%S ", TargetVMs::get_full_format_text(S->for_vm));
inbuild_nest *N;
linked_list *L = Projects::nest_list(project);

View file

@ -582,7 +582,7 @@ void ExtensionIndex::write_key(OUTPUT_STREAM) {
int i = 0;
target_vm *VM;
LOOP_OVER(VM, target_vm) {
if (VM->with_debugging_enabled) continue; /* avoids listing twice */
if (TargetVMs::debug_enabled(VM)) continue; /* avoids listing twice */
if (i++ > 0) WRITE(", ");
ExtensionIndex::plot_icon(OUT, VM);
TargetVMs::write(OUT, VM);

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,72 +1,72 @@
Total memory consumption was 387862K = 379 MB
Total memory consumption was 383663K = 375 MB
61.6% was used for 1997559 objects, in 371302 frames in 299 x 800K = 239200K = 233 MB:
61.5% was used for 1991443 objects, in 368767 frames in 295 x 800K = 236000K = 230 MB:
10.5% inter_tree_node_array 58 x 8192 = 475136 objects, 41813824 bytes
7.2% text_stream_array 5142 x 100 = 514200 objects, 28959744 bytes
4.3% linked_list 30875 objects, 17290000 bytes
10.6% inter_tree_node_array 58 x 8192 = 475136 objects, 41813824 bytes
7.3% text_stream_array 5126 x 100 = 512600 objects, 28869632 bytes
4.3% linked_list 30605 objects, 17138800 bytes
4.0% inter_symbol_array 139 x 1024 = 142336 objects, 15946080 bytes
2.6% parse_node 129399 objects, 10351920 bytes
2.6% parse_node 128478 objects, 10278240 bytes
1.8% verb_conjugation 160 objects, 7425280 bytes
1.3% parse_node_annotation_array 345 x 500 = 172500 objects, 5531040 bytes
1.3% parse_node_annotation_array 343 x 500 = 171500 objects, 5498976 bytes
0.8% pcalc_prop_array 25 x 1000 = 25000 objects, 3400800 bytes
0.8% inter_name_array 69 x 1000 = 69000 objects, 3314208 bytes
0.6% kind_array 68 x 1000 = 68000 objects, 2722176 bytes
0.6% kind_array 67 x 1000 = 67000 objects, 2682144 bytes
0.5% inter_name_generator_array 53 x 1000 = 53000 objects, 2121696 bytes
0.4% inter_schema_token 13472 objects, 1939968 bytes
0.4% inter_package 26572 objects, 1913184 bytes
0.4% package_request 21138 objects, 1860144 bytes
0.4% inter_schema_token 13430 objects, 1933920 bytes
0.4% inter_package 26435 objects, 1903320 bytes
0.4% package_request 20997 objects, 1847736 bytes
0.4% vocabulary_entry_array 161 x 100 = 16100 objects, 1808352 bytes
0.4% inter_symbols_table 26572 objects, 1700608 bytes
0.4% dictionary 33269 objects, 1596912 bytes
0.4% inter_symbols_table 26435 objects, 1691840 bytes
0.4% dictionary 33115 objects, 1589520 bytes
0.3% match_trie_array 11 x 1000 = 11000 objects, 1496352 bytes
0.3% i6_schema_array 23 x 100 = 2300 objects, 1380736 bytes
0.3% dict_entry_array 398 x 100 = 39800 objects, 1286336 bytes
0.3% dict_entry_array 399 x 100 = 39900 objects, 1289568 bytes
0.2% map_data 670 objects, 1125600 bytes
0.2% id_body 940 objects, 1075360 bytes
0.2% adjective_meaning 202 objects, 1000304 bytes
0.2% excerpt_meaning 3099 objects, 966888 bytes
0.2% id_body 898 objects, 1027312 bytes
0.2% adjective_meaning 196 objects, 970592 bytes
0.2% excerpt_meaning 3036 objects, 947232 bytes
0.2% production 3872 objects, 898304 bytes
0.2% ptoken 8382 objects, 871728 bytes
0.2% grammatical_usage 3611 objects, 866640 bytes
0.2% individual_form 2561 objects, 860496 bytes
0.2% inter_schema_node 8670 objects, 832320 bytes
0.2% grammatical_usage 3591 objects, 861840 bytes
0.2% individual_form 2537 objects, 852432 bytes
0.2% inter_schema_node 8647 objects, 830112 bytes
0.1% unary_predicate_array 16 x 1000 = 16000 objects, 640512 bytes
0.1% local_variable_array 47 x 100 = 4700 objects, 452704 bytes
---- scan_directory 94 objects, 388032 bytes
0.1% local_variable_array 46 x 100 = 4600 objects, 443072 bytes
---- verb_usage 1128 objects, 388032 bytes
---- scan_directory 94 objects, 388032 bytes
---- rule 469 objects, 367696 bytes
---- verb_form 386 objects, 345856 bytes
---- noun 2380 objects, 285600 bytes
---- compilation_subtask 3346 objects, 267680 bytes
---- noun 2360 objects, 283200 bytes
---- compilation_subtask 3338 objects, 267040 bytes
---- inference_subject 665 objects, 260680 bytes
---- inter_annotation_array 1 x 8192 objects, 196640 bytes
---- hierarchy_location 1116 objects, 169632 bytes
---- binary_predicate 321 objects, 169488 bytes
---- linguistic_stock_item 3316 objects, 159168 bytes
---- hierarchy_location 1103 objects, 167656 bytes
---- linguistic_stock_item 3292 objects, 158016 bytes
---- rule_family_data 400 objects, 147200 bytes
---- nonterminal 760 objects, 139840 bytes
---- nascent_array 2126 objects, 136064 bytes
---- nascent_array 2104 objects, 134656 bytes
---- documentation_ref 1273 objects, 112024 bytes
---- inference 1703 objects, 108992 bytes
---- imperative_defn 1376 objects, 99072 bytes
---- inter_tree 6 objects, 98304 bytes
---- noun_usage 2402 objects, 96080 bytes
---- anl_entry_array 2 x 1000 = 2000 objects, 96064 bytes
---- imperative_defn 1334 objects, 96048 bytes
---- noun_usage 2382 objects, 95280 bytes
---- preposition 273 objects, 87360 bytes
---- lexical_cluster 2517 objects, 80544 bytes
---- pcalc_term_array 2 x 1000 = 2000 objects, 80064 bytes
---- lexical_cluster 2493 objects, 79776 bytes
---- kind_variable_declaration 1652 objects, 79296 bytes
---- inter_schema 1508 objects, 72384 bytes
---- inter_schema 1503 objects, 72144 bytes
---- label_namespace 1468 objects, 70464 bytes
---- rulebook 407 objects, 68376 bytes
---- spatial_data 670 objects, 64320 bytes
---- kind_macro_definition 9 objects, 62280 bytes
---- booking 860 objects, 61920 bytes
---- actions_rcd_data 1880 objects, 60160 bytes
---- scenes_rcd_data 1880 objects, 60160 bytes
---- command_grammar 130 objects, 58240 bytes
---- kind_constructor 77 objects, 57904 bytes
---- actions_rcd_data 1796 objects, 57472 bytes
---- scenes_rcd_data 1796 objects, 57472 bytes
---- table 7 objects, 56672 bytes
---- pcalc_func_array 1 x 1000 objects, 56032 bytes
---- cg_line 230 objects, 53360 bytes
@ -74,17 +74,17 @@ Total memory consumption was 387862K = 379 MB
---- property_inference_data 1315 objects, 52600 bytes
---- response_message 407 objects, 52096 bytes
---- ap_clause_array 2 x 400 = 800 objects, 51264 bytes
---- inter_node_list 769 objects, 43064 bytes
---- inter_node_list 765 objects, 42840 bytes
---- text_substitution 436 objects, 41856 bytes
---- activity_list_array 1 x 1000 objects, 40032 bytes
---- anl_clause_array 1 x 1000 objects, 40032 bytes
---- to_family_data 496 objects, 39680 bytes
---- activity_list_array 1 x 1000 objects, 40032 bytes
---- shared_variable_access_list_array 12 x 100 = 1200 objects, 38784 bytes
---- parsing_data 670 objects, 37520 bytes
---- heading 198 objects, 36432 bytes
---- to_family_data 458 objects, 36640 bytes
---- heading 195 objects, 35880 bytes
---- production_list 617 objects, 34552 bytes
---- regions_data 670 objects, 32160 bytes
---- counting_data 670 objects, 32160 bytes
---- regions_data 670 objects, 32160 bytes
---- HTML_tag_array 1 x 1000 objects, 32032 bytes
---- property_permission 96 objects, 31488 bytes
---- stack_frame_box 304 objects, 29184 bytes
@ -101,18 +101,17 @@ Total memory consumption was 387862K = 379 MB
---- instance 167 objects, 17368 bytes
---- parse_node_tree 20 objects, 17280 bytes
---- understanding_reference_array 2 x 100 = 200 objects, 16064 bytes
---- linked_list_item_array 1 x 1000 objects, 16032 bytes
---- action_name_list_array 1 x 1000 objects, 16032 bytes
---- match_avinue_array 1 x 1000 objects, 16032 bytes
---- linked_list_item_array 1 x 1000 objects, 16032 bytes
---- to_phrase_request 59 objects, 15576 bytes
---- adjective 137 objects, 15344 bytes
---- adjective 133 objects, 14896 bytes
---- to_phrase_request 55 objects, 14520 bytes
---- booking_list 407 objects, 13024 bytes
---- adjective_iname_holder 320 objects, 12800 bytes
---- adjective_iname_holder 314 objects, 12560 bytes
---- pathname 294 objects, 11760 bytes
---- uniqueness_count 454 objects, 10896 bytes
---- uniqueness_count 453 objects, 10872 bytes
---- stopwatch_timer 113 objects, 9040 bytes
---- filename 212 objects, 8480 bytes
---- equation_node 68 objects, 7616 bytes
---- hierarchy_attachment_point 77 objects, 7392 bytes
---- understanding_item_array 3 x 100 = 300 objects, 7296 bytes
---- shared_variable_array 1 x 100 objects, 7232 bytes
@ -131,45 +130,43 @@ Total memory consumption was 387862K = 379 MB
---- submodule_request 94 objects, 3760 bytes
---- parse_node_annotation_type 114 objects, 3648 bytes
---- command_line_switch 43 objects, 3440 bytes
---- property_setting_bp_data 84 objects, 3360 bytes
---- compatibility_specification 70 objects, 3360 bytes
---- property_setting_bp_data 84 objects, 3360 bytes
---- method_set 103 objects, 3296 bytes
---- kind_constructor_comparison_schema_array 1 x 100 objects, 3232 bytes
---- inform_extension 19 objects, 3192 bytes
---- definition 44 objects, 3168 bytes
---- either_or_property_data 62 objects, 2976 bytes
---- definition 40 objects, 2880 bytes
---- use_option 29 objects, 2552 bytes
---- part_of_inference_data 79 objects, 2528 bytes
---- parentage_inference_data 79 objects, 2528 bytes
---- kind_constructor_casting_rule_array 1 x 100 objects, 2432 bytes
---- part_of_inference_data 79 objects, 2528 bytes
---- kind_constructor_instance_array 1 x 100 objects, 2432 bytes
---- kind_constructor_casting_rule_array 1 x 100 objects, 2432 bytes
---- inter_construct 30 objects, 2400 bytes
---- equation_symbol 30 objects, 2400 bytes
---- semver_range 22 objects, 2288 bytes
---- scene 1 object, 2096 bytes
---- pipeline_step 15 objects, 2040 bytes
---- pronoun_usage 42 objects, 1680 bytes
---- table_contribution_array 1 x 100 objects, 1632 bytes
---- plugin 25 objects, 1600 bytes
---- cached_kind_declaration 39 objects, 1560 bytes
---- cached_kind_declaration 37 objects, 1480 bytes
---- noun_filter_token 22 objects, 1408 bytes
---- build_script 44 objects, 1408 bytes
---- inter_tree_location_list 34 objects, 1360 bytes
---- inter_annotation_form 34 objects, 1360 bytes
---- special_meaning_holder 33 objects, 1320 bytes
---- table_column 16 objects, 1280 bytes
---- constant_phrase 20 objects, 1280 bytes
---- invocation_options_array 1 x 100 objects, 1224 bytes
---- target_vm 8 objects, 1216 bytes
---- direction_inference_data 30 objects, 1200 bytes
---- tree_inventory_item 28 objects, 1120 bytes
---- runtime_kind_structure 13 objects, 1040 bytes
---- target_vm 8 objects, 1088 bytes
---- quantifier 16 objects, 1024 bytes
---- pipeline_stage 20 objects, 960 bytes
---- submodule_identity 30 objects, 960 bytes
---- named_rulebook_outcome 15 objects, 960 bytes
---- pipeline_stage 20 objects, 960 bytes
---- code_generation 1 object, 888 bytes
---- inbuild_requirement 22 objects, 880 bytes
---- runtime_kind_structure 11 objects, 880 bytes
---- generated_segment 27 objects, 864 bytes
---- control_structure_phrase 12 objects, 864 bytes
---- cached_understanding 21 objects, 840 bytes
@ -177,16 +174,15 @@ Total memory consumption was 387862K = 379 MB
---- inter_data_type 14 objects, 784 bytes
---- internal_test 15 objects, 720 bytes
---- inform_language 6 objects, 672 bytes
---- inter_warehouse_room 10 objects, 640 bytes
---- relation_guard 5 objects, 640 bytes
---- I6T_intervention 8 objects, 640 bytes
---- relation_guard 5 objects, 640 bytes
---- inter_warehouse_room 10 objects, 640 bytes
---- inbuild_search_result 15 objects, 600 bytes
---- rulebook_outcome 17 objects, 544 bytes
---- small_word_set 11 objects, 528 bytes
---- inform_kit 5 objects, 520 bytes
---- implication 13 objects, 520 bytes
---- inform_pipeline 8 objects, 512 bytes
---- equation 4 objects, 480 bytes
---- inference_family 11 objects, 440 bytes
---- i6_memory_setting 13 objects, 416 bytes
---- module_package 10 objects, 400 bytes
@ -198,10 +194,10 @@ Total memory consumption was 387862K = 379 MB
---- pronoun 8 objects, 320 bytes
---- grammatical_category 8 objects, 320 bytes
---- tree_inventory 1 object, 312 bytes
---- build_step 4 objects, 288 bytes
---- up_family 9 objects, 288 bytes
---- door_to_notice 5 objects, 280 bytes
---- build_step 4 objects, 288 bytes
---- explicit_bp_data 5 objects, 280 bytes
---- door_to_notice 5 objects, 280 bytes
---- compilation_unit 5 objects, 280 bytes
---- contents_entry 7 objects, 280 bytes
---- verb_usage_tier 5 objects, 240 bytes
@ -214,47 +210,47 @@ Total memory consumption was 387862K = 379 MB
---- plural_dictionary_entry 4 objects, 192 bytes
---- inform_project 1 object, 176 bytes
---- kov_value_stick 3 objects, 168 bytes
---- inference_subject_family 5 objects, 160 bytes
---- inter_architecture 4 objects, 160 bytes
---- imperative_defn_family 4 objects, 160 bytes
---- link_instruction 4 objects, 160 bytes
---- inference_subject_family 5 objects, 160 bytes
---- inter_architecture 4 objects, 160 bytes
---- codegen_pipeline 1 object, 128 bytes
---- element_activation 4 objects, 128 bytes
---- inbuild_nest 3 objects, 120 bytes
---- local_block_value 2 objects, 112 bytes
---- inform_kit_ittt 2 objects, 96 bytes
---- compile_task_data 1 object, 80 bytes
---- group_together_function 2 objects, 80 bytes
---- article 2 objects, 80 bytes
---- group_together_function 2 objects, 80 bytes
---- inter_warehouse 1 object, 56 bytes
---- build_methodology 1 object, 56 bytes
---- figures_data 1 object, 56 bytes
---- inter_warehouse 1 object, 56 bytes
---- HTML_file_state 1 object, 48 bytes
---- star_invention 1 object, 48 bytes
---- by_function_bp_data 1 object, 40 bytes
---- loop_over_scope 1 object, 40 bytes
---- kind_template_definition 1 object, 40 bytes
---- by_function_bp_data 1 object, 40 bytes
---- I6_generation_data 1 object, 24 bytes
38.3% was used for memory not allocated for objects:
38.4% was used for memory not allocated for objects:
19.2% text stream storage 76354128 bytes in 531932 claims
4.5% dictionary storage 18177024 bytes in 33269 claims
19.1% text stream storage 75429500 bytes in 530079 claims
4.6% dictionary storage 18098176 bytes in 33115 claims
---- sorting 744 bytes in 3 claims
1.8% source text 7200000 bytes in 3 claims
2.7% source text details 10800000 bytes in 2 claims
---- documentation fragments 262144 bytes in 1 claim
---- linguistic stock array 81920 bytes in 2 claims
---- small word set array 105600 bytes in 22 claims
1.0% inter symbols storage 4175472 bytes in 27683 claims
1.0% inter symbols storage 4157936 bytes in 27546 claims
4.2% inter bytecode storage 16802804 bytes in 14 claims
4.0% inter links storage 16174208 bytes in 266 claims
4.1% inter links storage 16174208 bytes in 266 claims
---- inter tree location list storage 191232 bytes in 32 claims
0.4% instance-of-kind counting 1695204 bytes in 1 claim
---- compilation workspace for objects 21856 bytes in 25 claims
---- lists for type-checking invocations 16000 bytes in 1 claim
---- code generation workspace for objects 9648 bytes in 9 claims
---- emitter array storage 161920 bytes in 2064 claims
---- code generation workspace for objects 9600 bytes in 9 claims
---- emitter array storage 160512 bytes in 2042 claims
18.8% was overhead - 75000472 bytes = 73242K = 71 MB
18.4% was overhead - 72309928 bytes = 70615K = 68 MB

View file

@ -1,25 +1,25 @@
<s-literal> hits 2097/23838 nti 14 constraint (none) extremes [1, infinity)
<s-literal> hits 2075/23610 nti 14 constraint (none) extremes [1, infinity)
English:
(@1)<cardinal-number>=1
(hits 171/171) (matched: '100') constraint CS = {r0} extremes [1, 1]
(hits 160/160) (matched: '100') constraint CS = {r0} extremes [1, 1]
(@1)minus (@2)<cardinal-number>=1
(hits 0/1806) constraint DS = {14} extremes [2, 2]
(hits 0/1798) constraint DS = {14} extremes [2, 2]
(@1)<quoted-text>=1 (@2)( (@3)<response-letter>=2 (@4))
(hits 273/830) (matched: '"[current item from the multiple object list]: [run paragraph on]" ( a )') constraint DS = {14} extremes [4, 4]
(@1)<quoted-text>=1
(hits 1564/5543) (matched: 'Represents geographical locations, both indoor
(hits 1564/5532) (matched: 'Represents geographical locations, both indoor
and outdoor, which are not necessarily areas in a building. A player in one
room is mostly unable to sense, or interact with, anything in a different room.
Rooms are arranged in a map.') constraint (none) extremes [1, 1]
<s-literal-real-number>=1
(hits 11/9911) (matched: 'plus infinity') constraint (none) extremes [1, infinity)
(hits 0/9808) constraint (none) extremes [1, infinity)
(@1)<s-literal-truth-state>=1
(hits 78/196) (matched: 'false') constraint CS = {8} extremes [1, 1]
<s-literal-list>=1
(hits 0/3281) constraint DS = {10} extremes [2, infinity)
(hits 0/3197) constraint DS = {10} extremes [2, infinity)
(@1)unicode <s-unicode-character>=1
(hits 0/4183) constraint DS = {14} extremes [2, infinity)
(hits 0/4175) constraint DS = {14} extremes [2, infinity)
<s-literal-time>=1
(hits 0/3738) constraint DW = {11, 12, 13} extremes [2, 5]
<s-literal-unit-notation>=1
(hits 0/9822) constraint (none) extremes [1, infinity)
(hits 0/9730) constraint (none) extremes [1, infinity)

View file

@ -28,8 +28,8 @@ ROOT_NT
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}
UNPARSED_NOUN_NT'asking for information'
UNPARSED_NOUN_NT'out of world'
IMPERATIVE_NT'carry out asking for information' {unit: 4} {imperative definition: 798}
IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 799}
IMPERATIVE_NT'carry out asking for information' {unit: 4} {imperative definition: 756}
IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 757}
HEADING_NT'section 1 - errands' {heading 5} {under: H5'section 1 - errands'} {unit: 4}
SENTENCE_NT'the current actor is a person which varies' {unit: 4} {classified}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
@ -39,8 +39,8 @@ ROOT_NT
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
PROPER_NOUN_NT'current owner' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: NONLOCAL_VARIABLE_NT'current owner' {nonlocal: 'current owner'(var)person}} {created here}
COMMON_NOUN_NT'person which varies' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values variable-pointer'-k} {creation: << kind=people variable-pointer(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 800}
IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 801}
IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 758}
IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 759}
SENTENCE_NT'a person can be active or passive' {unit: 4} {classified}
VERB_NT'can be' {verb 'be able to be' s/p 3p act IS_TENSE +ve} {special meaning: can-be}
COMMON_NOUN_NT'a person' {refined} {refers: infs'person'} {creation: << kind=person(x) >>} {eval: TEST_VALUE_NT}
@ -56,34 +56,34 @@ ROOT_NT
VERB_NT'are' {verb 'be' 3p p act IS_TENSE +ve}
PROPER_NOUN_NT'character movement rules' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT {kind: rulebook} {rulebook: character movement}} {created here}
COMMON_NOUN_NT'rulebook' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values based rulebook producing values'-k} {creation: << kind=rulebook(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'the first character movement rule' {unit: 4} {imperative definition: 802}
IMPERATIVE_NT'a character movement rule' {unit: 4} {imperative definition: 803}
IMPERATIVE_NT'a character movement rule' {unit: 4} {imperative definition: 804}
IMPERATIVE_NT'to decide whether movement has not yet occurred' {unit: 4} {imperative definition: 805}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 806}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 807}
IMPERATIVE_NT'the first character movement rule' {unit: 4} {imperative definition: 760}
IMPERATIVE_NT'a character movement rule' {unit: 4} {imperative definition: 761}
IMPERATIVE_NT'a character movement rule' {unit: 4} {imperative definition: 762}
IMPERATIVE_NT'to decide whether movement has not yet occurred' {unit: 4} {imperative definition: 763}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 764}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 765}
SENTENCE_NT'the shopowner rules is a rulebook' {unit: 4} {classified} {clears pronouns}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
PROPER_NOUN_NT'shopowner rules' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT {kind: rulebook} {rulebook: shopowner}} {created here}
COMMON_NOUN_NT'rulebook' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values based rulebook producing values'-k} {creation: << kind=rulebook(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'a shopowner rule' {unit: 4} {imperative definition: 808}
IMPERATIVE_NT'report someone closing a door when the person asked owns the' {unit: 4} {imperative definition: 809}
IMPERATIVE_NT'report vanessa closing the metal door when the metal door is' {unit: 4} {imperative definition: 810}
IMPERATIVE_NT'a shopowner rule' {unit: 4} {imperative definition: 811}
IMPERATIVE_NT'a shopowner rule' {unit: 4} {imperative definition: 766}
IMPERATIVE_NT'report someone closing a door when the person asked owns the' {unit: 4} {imperative definition: 767}
IMPERATIVE_NT'report vanessa closing the metal door when the metal door is' {unit: 4} {imperative definition: 768}
IMPERATIVE_NT'a shopowner rule' {unit: 4} {imperative definition: 769}
SENTENCE_NT'filing is an action applying to one thing' {unit: 4} {classified}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}
UNPARSED_NOUN_NT'filing'
UNPARSED_NOUN_NT'applying to one thing'
IMPERATIVE_NT'before someone filing something which is not carried by the ' {unit: 4} {imperative definition: 812}
IMPERATIVE_NT'carry out someone filing' {unit: 4} {imperative definition: 813}
IMPERATIVE_NT'report someone filing' {unit: 4} {imperative definition: 814}
IMPERATIVE_NT'before someone filing something which is not carried by the ' {unit: 4} {imperative definition: 770}
IMPERATIVE_NT'carry out someone filing' {unit: 4} {imperative definition: 771}
IMPERATIVE_NT'report someone filing' {unit: 4} {imperative definition: 772}
SENTENCE_NT'the shopper rules is a rulebook' {unit: 4} {classified} {clears pronouns}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
PROPER_NOUN_NT'shopper rules' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT {kind: rulebook} {rulebook: shopper}} {created here}
COMMON_NOUN_NT'rulebook' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values based rulebook producing values'-k} {creation: << kind=rulebook(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'a shopper rule' {unit: 4} {imperative definition: 815}
IMPERATIVE_NT'a shopper rule' {unit: 4} {imperative definition: 816}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 817}
IMPERATIVE_NT'a shopper rule' {unit: 4} {imperative definition: 773}
IMPERATIVE_NT'a shopper rule' {unit: 4} {imperative definition: 774}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 775}
DEFN_CONT_NT'a room is air-conditioned' {unit: 4}
CODE_BLOCK_NT
CODE_BLOCK_NT {control structure: IF}
@ -141,8 +141,8 @@ ROOT_NT
COMMON_NOUN_NT'artwork' {indefinite 'an' n/m/f nom/acc s} {refined} {creation: << kind=artwork(x) >>} {refers: infs'artwork'} {eval: TEST_VALUE_NT} {created here}
KIND_NT'kind of thing' {refined} {refers: infs'thing'}
COMMON_NOUN_NT'thing' {refined} {refers: infs'thing'} {creation: << kind=thing(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'before printing the name of an artwork' {unit: 4} {imperative definition: 818}
IMPERATIVE_NT'after printing the name of an artwork' {unit: 4} {imperative definition: 819}
IMPERATIVE_NT'before printing the name of an artwork' {unit: 4} {imperative definition: 776}
IMPERATIVE_NT'after printing the name of an artwork' {unit: 4} {imperative definition: 777}
SENTENCE_NT'an artwork can be submitted or reserved' {unit: 4} {classified}
VERB_NT'can be' {verb 'be able to be' s/p 3p act IS_TENSE +ve} {special meaning: can-be}
COMMON_NOUN_NT'an artwork' {refined} {refers: infs'artwork'} {creation: << kind=artwork(x) >>} {eval: TEST_VALUE_NT}
@ -155,49 +155,49 @@ ROOT_NT
COMMON_NOUN_NT'book' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: << kind=book(x) >>} {refers: infs'book'} {eval: TEST_VALUE_NT} {created here}
KIND_NT'kind of artwork' {refined} {refers: infs'artwork'}
COMMON_NOUN_NT'artwork' {refined} {refers: infs'artwork'} {creation: << kind=artwork(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'before someone resolving a book when the person asked is not' {unit: 4} {imperative definition: 820}
IMPERATIVE_NT'carry out someone resolving a book' {unit: 4} {imperative definition: 821}
IMPERATIVE_NT'report someone resolving a book' {unit: 4} {imperative definition: 822}
IMPERATIVE_NT'before listing contents' {unit: 4} {imperative definition: 823}
IMPERATIVE_NT'before grouping together books' {unit: 4} {imperative definition: 824}
IMPERATIVE_NT'before someone resolving a book when the person asked is not' {unit: 4} {imperative definition: 778}
IMPERATIVE_NT'carry out someone resolving a book' {unit: 4} {imperative definition: 779}
IMPERATIVE_NT'report someone resolving a book' {unit: 4} {imperative definition: 780}
IMPERATIVE_NT'before listing contents' {unit: 4} {imperative definition: 781}
IMPERATIVE_NT'before grouping together books' {unit: 4} {imperative definition: 782}
SENTENCE_NT'a stamped envelope is a kind of thing' {unit: 4} {classified} {interpretation of subject: infs'book'}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
COMMON_NOUN_NT'stamped envelope' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: << kind=stamped envelope(x) >>} {refers: infs'stamped envelope'} {eval: TEST_VALUE_NT} {created here}
KIND_NT'kind of thing' {refined} {refers: infs'thing'}
COMMON_NOUN_NT'thing' {refined} {refers: infs'thing'} {creation: << kind=thing(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'before someone resolving a stamped envelope when the person ' {unit: 4} {imperative definition: 825}
IMPERATIVE_NT'carry out someone resolving a stamped envelope' {unit: 4} {imperative definition: 826}
IMPERATIVE_NT'report someone resolving a stamped envelope' {unit: 4} {imperative definition: 827}
IMPERATIVE_NT'instead of someone resolving a stamped envelope when the per' {unit: 4} {imperative definition: 828}
IMPERATIVE_NT'before someone resolving a stamped envelope when the person ' {unit: 4} {imperative definition: 783}
IMPERATIVE_NT'carry out someone resolving a stamped envelope' {unit: 4} {imperative definition: 784}
IMPERATIVE_NT'report someone resolving a stamped envelope' {unit: 4} {imperative definition: 785}
IMPERATIVE_NT'instead of someone resolving a stamped envelope when the per' {unit: 4} {imperative definition: 786}
SENTENCE_NT'a dvd is a kind of artwork' {unit: 4} {classified} {interpretation of subject: infs'stamped envelope'}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
COMMON_NOUN_NT'dvd' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: << kind=dvd(x) >>} {refers: infs'dvd'} {eval: TEST_VALUE_NT} {created here}
KIND_NT'kind of artwork' {refined} {refers: infs'artwork'}
COMMON_NOUN_NT'artwork' {refined} {refers: infs'artwork'} {creation: << kind=artwork(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'before someone resolving a dvd when the person asked is not ' {unit: 4} {imperative definition: 829}
IMPERATIVE_NT'carry out someone resolving a dvd' {unit: 4} {imperative definition: 830}
IMPERATIVE_NT'report someone resolving a dvd' {unit: 4} {imperative definition: 831}
IMPERATIVE_NT'instead of someone resolving a dvd when the person asked car' {unit: 4} {imperative definition: 832}
IMPERATIVE_NT'before listing contents' {unit: 4} {imperative definition: 833}
IMPERATIVE_NT'before grouping together dvds' {unit: 4} {imperative definition: 834}
IMPERATIVE_NT'before someone resolving a dvd when the person asked is not ' {unit: 4} {imperative definition: 787}
IMPERATIVE_NT'carry out someone resolving a dvd' {unit: 4} {imperative definition: 788}
IMPERATIVE_NT'report someone resolving a dvd' {unit: 4} {imperative definition: 789}
IMPERATIVE_NT'instead of someone resolving a dvd when the person asked car' {unit: 4} {imperative definition: 790}
IMPERATIVE_NT'before listing contents' {unit: 4} {imperative definition: 791}
IMPERATIVE_NT'before grouping together dvds' {unit: 4} {imperative definition: 792}
SENTENCE_NT'approaching is an action applying to one thing' {unit: 4} {classified}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}
UNPARSED_NOUN_NT'approaching'
UNPARSED_NOUN_NT'applying to one thing'
IMPERATIVE_NT'carry out someone approaching' {unit: 4} {imperative definition: 835}
IMPERATIVE_NT'carry out someone approaching' {unit: 4} {imperative definition: 793}
SENTENCE_NT'a coupon is a kind of thing' {unit: 4} {classified} {interpretation of subject: infs'dvd'}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
COMMON_NOUN_NT'coupon' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: << kind=coupon(x) >>} {refers: infs'coupon'} {eval: TEST_VALUE_NT} {created here}
KIND_NT'kind of thing' {refined} {refers: infs'thing'}
COMMON_NOUN_NT'thing' {refined} {refers: infs'thing'} {creation: << kind=thing(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'carry out someone resolving a coupon' {unit: 4} {imperative definition: 836}
IMPERATIVE_NT'carry out someone resolving a coupon' {unit: 4} {imperative definition: 794}
SENTENCE_NT'the block giving rule is not listed in any rulebook' {unit: 4} {classified}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {rule placement sense: negative} {special meaning: rule-listed-in}
UNPARSED_NOUN_NT'the block giving rule'
UNPARSED_NOUN_NT'in any rulebook'
IMPERATIVE_NT'check giving something to someone ( this is the block player' {unit: 4} {imperative definition: 837}
IMPERATIVE_NT'before someone resolving a coupon when the person asked is n' {unit: 4} {imperative definition: 838}
IMPERATIVE_NT'after someone giving a coupon to vanessa' {unit: 4} {imperative definition: 839}
IMPERATIVE_NT'check giving something to someone ( this is the block player' {unit: 4} {imperative definition: 795}
IMPERATIVE_NT'before someone resolving a coupon when the person asked is n' {unit: 4} {imperative definition: 796}
IMPERATIVE_NT'after someone giving a coupon to vanessa' {unit: 4} {imperative definition: 797}
SENTENCE_NT'infection color is a kind of value' {unit: 4} {classified} {interpretation of subject: infs'coupon'}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
COMMON_NOUN_NT'infection color' {refined} {creation: << kind=infection color(x) >>} {refers: infs'object'-k} {eval: TEST_VALUE_NT} {created here}
@ -257,7 +257,7 @@ ROOT_NT
AND_NT',' {refined}
PROPER_NOUN_NT'saffron silk' {refined} {refers: infs'saffron silk'} {eval: CONSTANT_NT'saffron silk' {kind: infection color} {instance: I86'saffron silk'[infection color]} {enumeration: 25}} {created here}
PROPER_NOUN_NT'cookie dough cream' {refined} {refers: infs'cookie dough cream'} {eval: CONSTANT_NT'cookie dough cream' {kind: infection color} {instance: I87'cookie dough cream'[infection color]} {enumeration: 26}} {created here}
IMPERATIVE_NT'to say list of flavors' {unit: 4} {imperative definition: 840}
IMPERATIVE_NT'to say list of flavors' {unit: 4} {imperative definition: 798}
SENTENCE_NT'understand "ask vanessa for [flavored ice cream]" as buying ' {unit: 4} {classified}
VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}
UNPARSED_NOUN_NT'"ask vanessa for [flavored ice cream]"'
@ -270,8 +270,8 @@ ROOT_NT
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}
UNPARSED_NOUN_NT'buying the flavor'
UNPARSED_NOUN_NT'applying to one infection color'
IMPERATIVE_NT'check buying the flavor' {unit: 4} {imperative definition: 841}
IMPERATIVE_NT'carry out buying the flavor' {unit: 4} {imperative definition: 842}
IMPERATIVE_NT'check buying the flavor' {unit: 4} {imperative definition: 799}
IMPERATIVE_NT'carry out buying the flavor' {unit: 4} {imperative definition: 800}
SENTENCE_NT'understand "ice cream" or "cream" or "ice" or "sherbet" or "' {unit: 4} {classified}
VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}
UNPARSED_NOUN_NT'"ice cream" or "cream" or "ice" or "sherbet" or "sorbet"'
@ -305,12 +305,12 @@ ROOT_NT
VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}
UNPARSED_NOUN_NT'the infection color property'
UNPARSED_NOUN_NT'referring to an ice cream cone'
IMPERATIVE_NT'carry out someone resolving an ice cream cone' {unit: 4} {imperative definition: 843}
IMPERATIVE_NT'instead of someone eating a fresh ice cream cone' {unit: 4} {imperative definition: 844}
IMPERATIVE_NT'report someone eating an ice cream cone' {unit: 4} {imperative definition: 845}
IMPERATIVE_NT'before printing the name of an ice cream cone' {unit: 4} {imperative definition: 846}
IMPERATIVE_NT'carry out someone resolving an ice cream cone' {unit: 4} {imperative definition: 801}
IMPERATIVE_NT'instead of someone eating a fresh ice cream cone' {unit: 4} {imperative definition: 802}
IMPERATIVE_NT'report someone eating an ice cream cone' {unit: 4} {imperative definition: 803}
IMPERATIVE_NT'before printing the name of an ice cream cone' {unit: 4} {imperative definition: 804}
HEADING_NT'section 2 - infection rules' {heading 5} {under: H5'section 2 - infection rules'} {unit: 4}
IMPERATIVE_NT'this is the infection rule' {unit: 4} {imperative definition: 847}
IMPERATIVE_NT'this is the infection rule' {unit: 4} {imperative definition: 805}
SENTENCE_NT'a person can be infected or clean' {unit: 4} {classified}
VERB_NT'can be' {verb 'be able to be' s/p 3p act IS_TENSE +ve} {special meaning: can-be}
COMMON_NOUN_NT'a person' {refined} {refers: infs'person'} {creation: << kind=person(x) >>} {eval: TEST_VALUE_NT}
@ -323,11 +323,11 @@ ROOT_NT
COMMON_NOUN_NT'person' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'person'} {creation: << kind=person(x) >>} {eval: TEST_VALUE_NT}
ALLOWED_NT'has' {refined}
UNPARSED_NOUN_NT'infection color' {indefinite 'an' n/m/f nom/acc s} {refined}
IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 848}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 849}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 850}
IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 851}
IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 852}
IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 806}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 807}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 808}
IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 809}
IMPERATIVE_NT'every turn' {unit: 4} {imperative definition: 810}
SENTENCE_NT'understand "sneeze on [something]" as sneezing on' {unit: 4} {classified}
VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}
UNPARSED_NOUN_NT'"sneeze on [something]"'
@ -336,11 +336,11 @@ ROOT_NT
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}
UNPARSED_NOUN_NT'sneezing on'
UNPARSED_NOUN_NT'applying to one thing'
IMPERATIVE_NT'check sneezing on' {unit: 4} {imperative definition: 853}
IMPERATIVE_NT'carry out sneezing on' {unit: 4} {imperative definition: 854}
IMPERATIVE_NT'carry out someone sneezing on' {unit: 4} {imperative definition: 855}
IMPERATIVE_NT'report sneezing on' {unit: 4} {imperative definition: 856}
IMPERATIVE_NT'report someone sneezing on' {unit: 4} {imperative definition: 857}
IMPERATIVE_NT'check sneezing on' {unit: 4} {imperative definition: 811}
IMPERATIVE_NT'carry out sneezing on' {unit: 4} {imperative definition: 812}
IMPERATIVE_NT'carry out someone sneezing on' {unit: 4} {imperative definition: 813}
IMPERATIVE_NT'report sneezing on' {unit: 4} {imperative definition: 814}
IMPERATIVE_NT'report someone sneezing on' {unit: 4} {imperative definition: 815}
SENTENCE_NT'understand "inject [someone] with [something]" as injecting ' {unit: 4} {classified}
VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}
UNPARSED_NOUN_NT'"inject [someone] with [something]"'
@ -361,10 +361,10 @@ ROOT_NT
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}
UNPARSED_NOUN_NT'injecting it with'
UNPARSED_NOUN_NT'applying to two things'
IMPERATIVE_NT'check injecting it with' {unit: 4} {imperative definition: 858}
IMPERATIVE_NT'carry out injecting it with' {unit: 4} {imperative definition: 859}
IMPERATIVE_NT'after injecting the player with something' {unit: 4} {imperative definition: 860}
IMPERATIVE_NT'report injecting it with' {unit: 4} {imperative definition: 861}
IMPERATIVE_NT'check injecting it with' {unit: 4} {imperative definition: 816}
IMPERATIVE_NT'carry out injecting it with' {unit: 4} {imperative definition: 817}
IMPERATIVE_NT'after injecting the player with something' {unit: 4} {imperative definition: 818}
IMPERATIVE_NT'report injecting it with' {unit: 4} {imperative definition: 819}
HEADING_NT'section 3 - geography' {heading 5} {under: H5'section 3 - geography'} {unit: 4}
INCLUSION_NT'include locksmith by emily short' {unit: 4}
HEADING_NT'version 12 of locksmith by emily short begins here' {heading 0} {under: H0'version 12 of locksmith by emily short begins here'} {includes: Locksmith by Emily Short v12 } {unit: 3}
@ -389,9 +389,9 @@ ROOT_NT
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}
UNPARSED_NOUN_NT'going toward'
UNPARSED_NOUN_NT'applying to one thing'
IMPERATIVE_NT'check going toward' {unit: 4} {imperative definition: 899}
IMPERATIVE_NT'carry out going toward' {unit: 4} {imperative definition: 900}
IMPERATIVE_NT'instead of waiting when the destination of the player is not' {unit: 4} {imperative definition: 901}
IMPERATIVE_NT'check going toward' {unit: 4} {imperative definition: 857}
IMPERATIVE_NT'carry out going toward' {unit: 4} {imperative definition: 858}
IMPERATIVE_NT'instead of waiting when the destination of the player is not' {unit: 4} {imperative definition: 859}
SENTENCE_NT'understand "stop" or "cease" as stopping' {unit: 4} {classified}
VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}
UNPARSED_NOUN_NT'"stop" or "cease"'
@ -400,11 +400,11 @@ ROOT_NT
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}
UNPARSED_NOUN_NT'stopping'
UNPARSED_NOUN_NT'applying to nothing'
IMPERATIVE_NT'carry out stopping' {unit: 4} {imperative definition: 902}
IMPERATIVE_NT'report stopping' {unit: 4} {imperative definition: 903}
IMPERATIVE_NT'after going to an air-conditioned room' {unit: 4} {imperative definition: 904}
IMPERATIVE_NT'after going from an air-conditioned room' {unit: 4} {imperative definition: 905}
IMPERATIVE_NT'instead of listening to an air-conditioned room' {unit: 4} {imperative definition: 906}
IMPERATIVE_NT'carry out stopping' {unit: 4} {imperative definition: 860}
IMPERATIVE_NT'report stopping' {unit: 4} {imperative definition: 861}
IMPERATIVE_NT'after going to an air-conditioned room' {unit: 4} {imperative definition: 862}
IMPERATIVE_NT'after going from an air-conditioned room' {unit: 4} {imperative definition: 863}
IMPERATIVE_NT'instead of listening to an air-conditioned room' {unit: 4} {imperative definition: 864}
SENTENCE_NT'the alfred cralle pool hall is a room' {unit: 4} {classified} {interpretation of subject: infs'person'}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
PROPER_NOUN_NT'alfred cralle pool hall' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'alfred cralle pool hall'} {eval: CONSTANT_NT'alfred cralle pool hall' {kind: object} {instance: I88'alfred cralle pool hall'} {enumeration: 0}} {created here}
@ -446,7 +446,7 @@ ROOT_NT
PROPER_NOUN_NT'felt door' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'felt door'} {eval: CONSTANT_NT'felt door' {kind: door} {instance: I90'felt door'} {enumeration: 0}}
PROPER_NOUN_NT'description' {refined} {eval: CONSTANT_NT {kind: texts valued property} {property: 'description'=text}}
PROPER_NOUN_NT'"It has a prominent lock, designed for an old-fashioned key.' {refined} {eval: CONSTANT_NT'"It has a prominent lock, designed for an old-fashioned key.' {kind: text}}
IMPERATIVE_NT'after locking a door with something in the presence of an ot' {unit: 4} {imperative definition: 907}
IMPERATIVE_NT'after locking a door with something in the presence of an ot' {unit: 4} {imperative definition: 865}
SENTENCE_NT'nancy johnson memorial square is west of the felt door' {unit: 4} {classified} {interpretation of subject: infs'key to the city'}
VERB_NT'is west of' {verb 'be' 3p s act IS_TENSE +ve} {prep1: west of}
PROPER_NOUN_NT'nancy johnson memorial square' {refined} {refers: infs'nancy johnson memorial square'} {eval: CONSTANT_NT'nancy johnson memorial square' {kind: object} {instance: I92'nancy johnson memorial square'} {enumeration: 0}} {created here}
@ -508,8 +508,8 @@ ROOT_NT
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
PROPER_NOUN_NT'slot' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'slot'} {eval: CONSTANT_NT'slot' {kind: object} {instance: I97'slot'} {enumeration: 0}}
COMMON_NOUN_NT'container' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'container'} {creation: << kind=container(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'carry out inserting something into the slot' {unit: 4} {imperative definition: 908}
IMPERATIVE_NT'report inserting something into the slot' {unit: 4} {imperative definition: 909}
IMPERATIVE_NT'carry out inserting something into the slot' {unit: 4} {imperative definition: 866}
IMPERATIVE_NT'report inserting something into the slot' {unit: 4} {imperative definition: 867}
SENTENCE_NT'hamwi street is northeast of an iron gate' {unit: 4} {classified} {interpretation of subject: infs'slot'}
VERB_NT'is northeast of' {verb 'be' 3p s act IS_TENSE +ve} {prep1: northeast of}
PROPER_NOUN_NT'hamwi street' {refined} {refers: infs'hamwi street'} {eval: CONSTANT_NT'hamwi street' {kind: object} {instance: I98'hamwi street'} {enumeration: 0}} {created here}
@ -533,7 +533,7 @@ ROOT_NT
AND_NT'and' {refined}
ADJECTIVE_NT'lockable' {refined} {predicate: lockable} {creation: << lockable(x) ^ lockable(x) >>}
ADJECTIVE_NT'unlocked' {refined} {predicate: unlocked} {creation: << unlocked(x) ^ unlocked(x) >>}
IMPERATIVE_NT'before printing the name of the iron gate while not opening ' {unit: 4} {imperative definition: 910}
IMPERATIVE_NT'before printing the name of the iron gate while not opening ' {unit: 4} {imperative definition: 868}
SENTENCE_NT'cold comfort ice cream is north of a metal door' {unit: 4} {classified} {interpretation of subject: infs'iron gate'}
VERB_NT'is north of' {verb 'be' 3p s act IS_TENSE +ve} {prep1: north of}
PROPER_NOUN_NT'cold comfort ice cream' {refined} {refers: infs'cold comfort ice cream'} {eval: CONSTANT_NT'cold comfort ice cream' {kind: object} {instance: I100'cold comfort ice cream'} {enumeration: 0}} {created here}
@ -639,8 +639,8 @@ ROOT_NT
VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}
UNPARSED_NOUN_NT'"glass"'
UNPARSED_NOUN_NT'the box'
IMPERATIVE_NT'instead of attacking the closed emergency box' {unit: 4} {imperative definition: 911}
IMPERATIVE_NT'instead of attacking the open emergency box' {unit: 4} {imperative definition: 912}
IMPERATIVE_NT'instead of attacking the closed emergency box' {unit: 4} {imperative definition: 869}
IMPERATIVE_NT'instead of attacking the open emergency box' {unit: 4} {imperative definition: 870}
SENTENCE_NT'the syringe is in the emergency box' {unit: 4} {classified} {interpretation of subject: infs'emergency box'}
VERB_NT'is in' {verb 'be' 3p s act IS_TENSE +ve} {prep1: in}
PROPER_NOUN_NT'syringe' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'syringe'} {eval: CONSTANT_NT'syringe' {kind: object} {instance: I109'syringe'} {enumeration: 0}} {created here}
@ -743,8 +743,8 @@ ROOT_NT
SENTENCE_NT'use full-length room descriptions' {unit: 4} {classified}
VERB_NT'use' {verb 'use' 3p p act IS_TENSE +ve} {special meaning: use}
UNPARSED_NOUN_NT'full-length room descriptions'
IMPERATIVE_NT'after looking in an outdoors room' {unit: 4} {imperative definition: 913}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 914}
IMPERATIVE_NT'after looking in an outdoors room' {unit: 4} {imperative definition: 871}
IMPERATIVE_NT'definition' {unit: 4} {imperative definition: 872}
DEFN_CONT_NT'a door is proximate' {unit: 4}
CODE_BLOCK_NT
CODE_BLOCK_NT {control structure: IF}
@ -765,7 +765,7 @@ ROOT_NT
INVOCATION_NT'yes' {phrase invoked: <no-inter-name>}
INVOCATION_LIST_NT'no' {unit: 4}
INVOCATION_NT'no' {phrase invoked: <no-inter-name>}
IMPERATIVE_NT'before exiting when the player is in an indoors room' {unit: 4} {imperative definition: 915}
IMPERATIVE_NT'before exiting when the player is in an indoors room' {unit: 4} {imperative definition: 873}
SENTENCE_NT'blank is a room' {unit: 4} {classified} {interpretation of subject: infs'key to the city'}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
PROPER_NOUN_NT'blank' {refined} {refers: infs'blank'} {eval: CONSTANT_NT'blank' {kind: object} {instance: I113'blank'} {enumeration: 0}} {created here}
@ -991,15 +991,15 @@ ROOT_NT
PROPER_NOUN_NT'ned' {refined} {refers: infs'ned'} {eval: CONSTANT_NT'ned' {kind: man} {instance: I166'ned'} {enumeration: 0}}
RELATIONSHIP_NT'owns' {meaning: ownership-r} {refined}
PROPER_NOUN_NT'movie rental' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'movie rental store'} {eval: CONSTANT_NT'movie rental store' {kind: object} {instance: I104'movie rental store'} {enumeration: 0}}
IMPERATIVE_NT'after printing the name of someone ( called target ) while l' {unit: 4} {imperative definition: 916}
IMPERATIVE_NT'after printing the name of someone ( called target ) while l' {unit: 4} {imperative definition: 874}
SENTENCE_NT'the description of a person is usually "[The noun] [if the n' {unit: 4} {classified} {interpretation of subject: infs'ned'}
VERB_NT'is usually' {certainty:likely} {verb 'be' 3p s act IS_TENSE +ve}
X_OF_Y_NT'description of a person' {definite 'the' n/m/f s/p nom/acc} {refined}
COMMON_NOUN_NT'person' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'person'} {creation: << kind=person(x) >>} {eval: TEST_VALUE_NT}
PROPER_NOUN_NT'description' {refined} {eval: CONSTANT_NT {kind: texts valued property} {property: 'description'=text}}
PROPER_NOUN_NT'"[The noun] [if the noun is clean]looks healthy[otherwise]is' {refined} {eval: CONSTANT_NT'"[The noun] [if the noun is clean]looks healthy[otherwise]is' {kind: text}}
IMPERATIVE_NT'after examining another person who is carrying something' {unit: 4} {imperative definition: 917}
IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 918}
IMPERATIVE_NT'after examining another person who is carrying something' {unit: 4} {imperative definition: 875}
IMPERATIVE_NT'when play begins' {unit: 4} {imperative definition: 876}
HEADING_NT'section 5 - conversation' {heading 5} {under: H5'section 5 - conversation'} {unit: 4}
SENTENCE_NT'a person has a table name called conversation' {unit: 4} {classified}
VERB_NT'has' {verb 'have' 3p s act IS_TENSE +ve}
@ -1008,8 +1008,8 @@ ROOT_NT
PROPERTYCALLED_NT'called'
UNPARSED_NOUN_NT'table name' {indefinite 'a' n/m/f nom/acc s}
UNPARSED_NOUN_NT'conversation'
IMPERATIVE_NT'instead of asking someone about something' {unit: 4} {imperative definition: 919}
IMPERATIVE_NT'instead of telling someone about something' {unit: 4} {imperative definition: 920}
IMPERATIVE_NT'instead of asking someone about something' {unit: 4} {imperative definition: 877}
IMPERATIVE_NT'instead of telling someone about something' {unit: 4} {imperative definition: 878}
SENTENCE_NT'understand "recap" or "recall" or "review" as recalling conv' {unit: 4} {classified}
VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as}
UNPARSED_NOUN_NT'"recap" or "recall" or "review"'
@ -1018,7 +1018,7 @@ ROOT_NT
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action}
UNPARSED_NOUN_NT'recalling conversations'
UNPARSED_NOUN_NT'applying to nothing'
IMPERATIVE_NT'carry out recalling conversations' {unit: 4} {imperative definition: 921}
IMPERATIVE_NT'carry out recalling conversations' {unit: 4} {imperative definition: 879}
SENTENCE_NT'the conversation of a person is usually table of general chi' {unit: 4} {classified} {interpretation of subject: infs'person'}
VERB_NT'is usually' {certainty:likely} {verb 'be' 3p s act IS_TENSE +ve}
X_OF_Y_NT'conversation of a person' {definite 'the' n/m/f s/p nom/acc} {refined}
@ -1033,7 +1033,7 @@ ROOT_NT
PROPER_NOUN_NT'conversation' {refined} {eval: CONSTANT_NT {kind: table names valued property} {property: 'conversation'=table name}}
PROPER_NOUN_NT'table of vanessa chatter' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT'table of vanessa chatter' {kind: table name} {table: table_data}{meaning: {table of vanessa chatter = TABLE_MC}}}
TABLE_NT'table of vanessa chatter topic reply summary turn stamp char' {unit: 4}
IMPERATIVE_NT'after reading a command' {unit: 4} {imperative definition: 922}
IMPERATIVE_NT'after reading a command' {unit: 4} {imperative definition: 880}
HEADING_NT'section 6 - movement description' {heading 5} {under: H5'section 6 - movement description'} {unit: 4}
SENTENCE_NT'a person has some text called walk style' {unit: 4} {classified}
VERB_NT'has' {verb 'have' 3p s act IS_TENSE +ve}
@ -1080,8 +1080,8 @@ ROOT_NT
PROPER_NOUN_NT'"sashay"' {refined} {eval: CONSTANT_NT'"sashay"' {kind: text}}
TABLE_NT'table of visible exits character second third heading chosen' {unit: 4}
TABLE_NT'table of visible entrances character second third heading ch' {unit: 4}
IMPERATIVE_NT'to clear ( current table - a table name )' {unit: 4} {imperative definition: 923}
IMPERATIVE_NT'to tidy departures of ( current table - a table name )' {unit: 4} {imperative definition: 924}
IMPERATIVE_NT'to clear ( current table - a table name )' {unit: 4} {imperative definition: 881}
IMPERATIVE_NT'to tidy departures of ( current table - a table name )' {unit: 4} {imperative definition: 882}
SENTENCE_NT'a door has a person called last opener' {unit: 4} {classified} {interpretation of subject: infs'person'}
VERB_NT'has' {verb 'have' 3p s act IS_TENSE +ve}
COMMON_NOUN_NT'door' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'door'} {creation: << kind=door(x) >>} {eval: TEST_VALUE_NT}
@ -1089,21 +1089,21 @@ ROOT_NT
PROPERTYCALLED_NT'called'
UNPARSED_NOUN_NT'person' {indefinite 'a' n/m/f nom/acc s}
UNPARSED_NOUN_NT'last opener'
IMPERATIVE_NT'report someone opening a door' {unit: 4} {imperative definition: 925}
IMPERATIVE_NT'report someone going through a door ( called route )' {unit: 4} {imperative definition: 926}
IMPERATIVE_NT'report someone opening a door' {unit: 4} {imperative definition: 883}
IMPERATIVE_NT'report someone going through a door ( called route )' {unit: 4} {imperative definition: 884}
SENTENCE_NT'the last thing named is a thing that varies' {unit: 4} {classified} {interpretation of subject: infs'door'}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
PROPER_NOUN_NT'last thing named' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: NONLOCAL_VARIABLE_NT'last thing named' {nonlocal: 'last thing named'(var)thing}} {created here}
COMMON_NOUN_NT'thing that varies' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values variable-pointer'-k} {creation: << kind=things variable-pointer(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'before printing the name of something ( called target ) whic' {unit: 4} {imperative definition: 927}
IMPERATIVE_NT'report someone going a direction' {unit: 4} {imperative definition: 928}
IMPERATIVE_NT'this is the movement reporting rule' {unit: 4} {imperative definition: 929}
IMPERATIVE_NT'to generate descriptions from ( current table - a table name' {unit: 4} {imperative definition: 930}
IMPERATIVE_NT'before printing the name of something ( called target ) whic' {unit: 4} {imperative definition: 885}
IMPERATIVE_NT'report someone going a direction' {unit: 4} {imperative definition: 886}
IMPERATIVE_NT'this is the movement reporting rule' {unit: 4} {imperative definition: 887}
IMPERATIVE_NT'to generate descriptions from ( current table - a table name' {unit: 4} {imperative definition: 888}
SENTENCE_NT'the last person named is a person that varies' {unit: 4} {classified} {interpretation of subject: infs'door'}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
PROPER_NOUN_NT'last person named' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: NONLOCAL_VARIABLE_NT'last person named' {nonlocal: 'last person named'(var)person}} {created here}
COMMON_NOUN_NT'person that varies' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values variable-pointer'-k} {creation: << kind=people variable-pointer(x) >>} {eval: TEST_VALUE_NT}
IMPERATIVE_NT'before printing the name of a person ( called target )' {unit: 4} {imperative definition: 931}
IMPERATIVE_NT'before printing the name of a person ( called target )' {unit: 4} {imperative definition: 889}
SENTENCE_NT'group size is a number that varies' {unit: 4} {classified} {interpretation of subject: infs'door'}
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
PROPER_NOUN_NT'group size' {refined} {eval: NONLOCAL_VARIABLE_NT'group size' {nonlocal: 'group size'(var)number}} {created here}
@ -1112,19 +1112,19 @@ ROOT_NT
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
PROPER_NOUN_NT'group size' {refined} {eval: NONLOCAL_VARIABLE_NT'group size' {nonlocal: 'group size'(var)number}{meaning: {group size = VARIABLE_MC}}}
PROPER_NOUN_NT'1' {refined} {eval: CONSTANT_NT'1' {kind: number} {explicit literal} {number: 1}}
IMPERATIVE_NT'to clear marked people' {unit: 4} {imperative definition: 932}
IMPERATIVE_NT'before listing nondescript items' {unit: 4} {imperative definition: 933}
IMPERATIVE_NT'to describe patients' {unit: 4} {imperative definition: 934}
IMPERATIVE_NT'to say ( named character - a man ) as pronoun' {unit: 4} {imperative definition: 935}
IMPERATIVE_NT'to say ( named character - a woman ) as pronoun' {unit: 4} {imperative definition: 936}
IMPERATIVE_NT'to say looks as though dipped in for ( index - a number )' {unit: 4} {imperative definition: 937}
IMPERATIVE_NT'to clear marked people' {unit: 4} {imperative definition: 890}
IMPERATIVE_NT'before listing nondescript items' {unit: 4} {imperative definition: 891}
IMPERATIVE_NT'to describe patients' {unit: 4} {imperative definition: 892}
IMPERATIVE_NT'to say ( named character - a man ) as pronoun' {unit: 4} {imperative definition: 893}
IMPERATIVE_NT'to say ( named character - a woman ) as pronoun' {unit: 4} {imperative definition: 894}
IMPERATIVE_NT'to say looks as though dipped in for ( index - a number )' {unit: 4} {imperative definition: 895}
TABLE_NT'table of dipping phrases dipping "looks as though dipped in"' {unit: 4}
SENTENCE_NT'a door is usually scenery' {unit: 4} {classified} {interpretation of subject: infs'door'}
VERB_NT'is usually' {certainty:likely} {verb 'be' 3p s act IS_TENSE +ve}
COMMON_NOUN_NT'door' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'door'} {creation: << kind=door(x) >>} {eval: TEST_VALUE_NT}
ADJECTIVE_NT'scenery' {refined} {predicate: scenery} {creation: << scenery(x) ^ scenery(x) >>}
IMPERATIVE_NT'to make delimiter ( index - a number ) of ( count - a number' {unit: 4} {imperative definition: 938}
IMPERATIVE_NT'to say optional comma' {unit: 4} {imperative definition: 939}
IMPERATIVE_NT'to make delimiter ( index - a number ) of ( count - a number' {unit: 4} {imperative definition: 896}
IMPERATIVE_NT'to say optional comma' {unit: 4} {imperative definition: 897}
SENTENCE_NT'test me with go to cold comfort / z / z / z / z / ask vaness' {unit: 4} {classified}
VERB_NT'test' {verb 'test' 3p p act IS_TENSE +ve} {prep2: with} {special meaning: test-with}
UNPARSED_NOUN_NT'me'

View file

@ -1,37 +1,37 @@
100.0% in inform7 run
54.5% in compilation to Inter
39.6% in //Sequence::undertake_queued_tasks//
3.5% in //MajorNodes::pre_pass//
2.6% in //MajorNodes::pass_1//
1.6% in //RTPhrasebook::compile_entries//
1.4% in //ImperativeDefinitions::assess_all//
1.1% in //RTKindConstructors::compile//
54.0% in compilation to Inter
39.4% in //Sequence::undertake_queued_tasks//
3.3% in //MajorNodes::pre_pass//
2.5% in //MajorNodes::pass_1//
1.3% in //ImperativeDefinitions::assess_all//
1.3% in //RTPhrasebook::compile_entries//
1.2% in //RTKindConstructors::compile//
0.4% in //ImperativeDefinitions::compile_first_block//
0.4% in //MajorNodes::pass_2//
0.4% in //Sequence::undertake_queued_tasks//
0.4% in //Sequence::undertake_queued_tasks//
0.4% in //World::stage_V//
0.2% in //ImperativeDefinitions::compile_first_block//
0.2% in //Sequence::undertake_queued_tasks//
0.1% in //CompletionModule::compile//
0.2% in //CompletionModule::compile//
0.1% in //InferenceSubjects::emit_all//
0.1% in //RTKindConstructors::compile_permissions//
0.1% in //Task::make_built_in_kind_constructors//
0.1% in //World::stages_II_and_III//
1.9% not specifically accounted for
43.5% in running Inter pipeline
11.9% in step preparation
9.7% in inter step 7/15: consolidate-text
8.0% in inter step 2/15: link
44.0% in running Inter pipeline
11.6% in step preparation
10.1% in inter step 7/15: consolidate-text
8.1% in inter step 2/15: link
7.8% in inter step 15/15: generate inform6 -> auto.inf
1.4% in inter step 11/15: make-identifiers-unique
1.6% in inter step 11/15: make-identifiers-unique
0.4% in inter step 12/15: reconcile-verbs
0.2% in inter step 10/15: detect-indirect-calls
0.2% in inter step 14/15: eliminate-redundant-operations
0.2% in inter step 6/15: assimilate
0.2% in inter step 8/15: resolve-external-symbols
0.2% in inter step 9/15: inspect-plugs
0.1% in inter step 10/15: detect-indirect-calls
0.1% in inter step 13/15: eliminate-redundant-labels
0.1% in inter step 4/15: parse-linked-matter
0.1% in inter step 5/15: resolve-conditional-compilation
2.2% not specifically accounted for
1.7% in supervisor
0.2% not specifically accounted for
2.5% not specifically accounted for
1.6% in supervisor
0.3% not specifically accounted for

View file

@ -41,9 +41,22 @@ what the Inform UI apps typically call when the user clicks "Go":
= (text as ConsoleText)
$ inform7/Tangled/inform7 -internal I -external E -project P -format=F
=
for suitable pathnames |I|, |E|, |P| and a choice of |F|. To dispose of this
first, |-format=ulx| tells Inform to compile to the Glulx story file, and
|-format=z8| to (version 8 of) the Z-machine.
for suitable pathnames |I|, |E|, |P| and a choice of |F|.
The format |F| can have quite a complex syntax. It takes the form of a
sequence of criteria divided by slashes. The first will be the name of the
language which //inform7// is writing as its output; the second will be the
architecture used. Thus, |inform6/32d| means "32-bit Inform 6 code with
debugging enabled", and this in practice is what the Inform UI apps make
when Glulx is the preferred virtual machine, as it is by default. But other
alternatives are available at the command line, and it's also possible for
|-format| to specify a semantic version number for the target, or some
compilation options. See //arch// for a fuller description.
In previous releases of Inform, |-format=F| had a cruder syntax in which only
|-format=ulx|, |-format=z5| and |-format=z8| were allowed. Those are still
recognised, but deprecated. Inform will print a warning about this and supply
the equivalent modern notation if one is used.
The project |P| is the directory holding the project to compile, such as
|Bronze.inform|. On MacOS, this will be a bundle, and will look like an

View file

@ -15,4 +15,4 @@ inform7/Tests/Test\ Externals/_Build/XText-I.o: inform7/Tests/Test\ Externals/_B
clang -g -std=c99 -c -o inform7/Tests/Test\ Externals/_Build/XText-I.o inform7/Tests/Test\ Externals/_Build/XText-I.c -Wno-parentheses-equality -D DEBUG -D I7_NO_MAIN -I inform7/Internal/Miscellany
inform7/Tests/Test\ Externals/_Build/XText-I.c: inform7/Tests/Test\ Externals/_Source/XText.i7
'inform7/Tangled/inform7' '-kit' 'BasicInformKit' '-format=C/32d' '-no-progress' '-fixtime' '-rng' '-sigils' '-log' 'nothing' '-external' 'inform7/Tests' '-transient' '/Users/gnelson/Natural Inform/intest/Workspace/T0/Transient' '-no-index' '-internal' 'inform7/Internal' '-format=ulx' '-project' '/Users/gnelson/Natural Inform/intest/Workspace/T0/Example.inform' '-variable' '*tout=inform7/Tests/Test Externals/_Textual/XText.intert' '-variable' '*cout=inform7/Tests/Test Externals/_Build/XText-I.c' '-pipeline' 'test_any'
'inform7/Tangled/inform7' '-kit' 'BasicInformKit' '-format=C/32d' '-no-progress' '-fixtime' '-rng' '-sigils' '-log' 'nothing' '-external' 'inform7/Tests' '-transient' '/Users/gnelson/Natural Inform/intest/Workspace/T0/Transient' '-no-index' '-internal' 'inform7/Internal' '-project' '/Users/gnelson/Natural Inform/intest/Workspace/T0/Example.inform' '-variable' '*tout=inform7/Tests/Test Externals/_Textual/XText.intert' '-variable' '*out=inform7/Tests/Test Externals/_Build/XText-I.c' '-pipeline' 'test_any'

View file

@ -22,27 +22,10 @@ void GenericModule::compile_basic_constants(void) {
if (TargetVMs::debug_enabled(VM)) GenericModule::emit_one(DEBUG_HL, 1);
@<Special constants for Z-machine and Glulx VMs@>;
if (TargetVMs::is_16_bit(VM)) @<16-bit constants@>
else @<32-bit constants@>;
}
@ These constants may be predefined in the veneer of the Inform 6 compiler,
if that is being used further down the compilation chain, but we want to define
them here regardless of that: and then linking can work properly, and the code
will make sense even if I6 is not the final code-generator.
@<Special constants for Z-machine and Glulx VMs@> =
if (Str::eq(VM->family_name, I"Z-Machine")) {
GenericModule::emit_one(TARGET_ZCODE_HL, 1);
GenericModule::emit_one(DICT_WORD_SIZE_HL, 6);
}
if (Str::eq(VM->family_name, I"Glulx")) {
GenericModule::emit_one(TARGET_GLULX_HL, 1);
GenericModule::emit_one(DICT_WORD_SIZE_HL, 9);
GenericModule::emit_one(INDIV_PROP_START_HL, 0);
}
@ These constants mostly have obvious meanings, but a few notes:
(1) |NULL|, in our runtime, is -1, and not 0 as it would be in C. This is
@ -69,6 +52,8 @@ in the VM can be added to it without it becoming negative.
GenericModule::emit_hex(REPARSE_CODE_HL, 10000);
GenericModule::emit_one(MAX_POSITIVE_NUMBER_HL, 32767);
GenericModule::emit_signed(MIN_NEGATIVE_NUMBER_HL, -32768);
GenericModule::emit_one(TARGET_ZCODE_HL, 1);
GenericModule::emit_one(DICT_WORD_SIZE_HL, 6);
@<32-bit constants@> =
GenericModule::emit_one(WORDSIZE_HL, 4);
@ -79,6 +64,9 @@ in the VM can be added to it without it becoming negative.
GenericModule::emit_hex(REPARSE_CODE_HL, 0x40000000);
GenericModule::emit_one(MAX_POSITIVE_NUMBER_HL, 2147483647);
GenericModule::emit_signed(MIN_NEGATIVE_NUMBER_HL, -2147483648);
GenericModule::emit_one(TARGET_GLULX_HL, 1);
GenericModule::emit_one(DICT_WORD_SIZE_HL, 9);
GenericModule::emit_one(INDIV_PROP_START_HL, 0);
@ Note that all of these constants are made available for linking:

View file

@ -108,7 +108,7 @@ pipeline_step *CodeGen::Pipeline::read_step(text_stream *step, dictionary *D,
} else if (Regexp::match(&mr, step, L"(%c+?) *-> *(%c*)")) {
ST->target_argument = NULL;
ST->take_target_argument_from_VM = TRUE;
ST->step_argument = CodeGen::Pipeline::read_parameter(mr.exp[2], D, tfp);
ST->step_argument = CodeGen::Pipeline::read_parameter(mr.exp[1], D, tfp);
if (ST->step_argument == NULL) return NULL;
Str::copy(step, mr.exp[0]);
}
@ -284,7 +284,7 @@ void CodeGen::Pipeline::run(pathname *P, codegen_pipeline *S, linked_list *PP,
if ((VM) && (step->take_target_argument_from_VM)) {
code_generation_target *cgt;
LOOP_OVER(cgt, code_generation_target)
if (Str::eq_insensitive(VM->format_name, cgt->target_name))
if (Str::eq_insensitive(TargetVMs::family(VM), cgt->target_name))
step->target_argument = cgt;
if (step->target_argument == NULL) {
#ifdef PROBLEMS_MODULE

View file

@ -291,7 +291,7 @@ int Compatibility::parse_token(compat_parser_state *cps, text_stream *token, int
target_vm *VM;
int seen = FALSE;
LOOP_OVER(VM, target_vm)
if (Str::eq_insensitive(VM->family_name, cps->current_family)) {
if (TargetVMs::compatible_with(VM, cps->current_family)) {
seen = TRUE;
if ((VersionNumbers::eq(VM->version, V)) &&
((with == NOT_APPLICABLE) || (TargetVMs::debug_enabled(VM) == with)))
@ -314,7 +314,7 @@ int Compatibility::parse_token(compat_parser_state *cps, text_stream *token, int
int seen = FALSE;
target_vm *VM;
LOOP_OVER(VM, target_vm)
if (Str::eq_insensitive(VM->family_name, token)) {
if (TargetVMs::compatible_with(VM, token)) {
seen = TRUE;
if (TargetVMs::debug_enabled(VM) == with)
Compatibility::add_exception(cps->C, VM);
@ -326,8 +326,8 @@ int Compatibility::parse_token(compat_parser_state *cps, text_stream *token, int
@<Construe token as a family name@> =
target_vm *VM;
LOOP_OVER(VM, target_vm)
if (Str::eq_insensitive(VM->family_name, token)) {
cps->current_family = VM->family_name;
if (TargetVMs::compatible_with(VM, token)) {
cps->current_family = TargetVMs::family(VM);
return TRUE;
}
return FALSE;
@ -336,7 +336,7 @@ int Compatibility::parse_token(compat_parser_state *cps, text_stream *token, int
if ((cps->family_used == FALSE) && (Str::len(cps->current_family) > 0)) {
target_vm *VM;
LOOP_OVER(VM, target_vm)
if (Str::eq_insensitive(cps->current_family, VM->family_name))
if (TargetVMs::compatible_with(VM, cps->current_family))
Compatibility::add_exception(cps->C, VM);
}
return TRUE;

View file

@ -2,202 +2,277 @@
To deal with multiple object code formats.
@h Object code.
The end result of compilation is traditionally called "object code" and
people tend to use words like "binary" or even "machine code" about it,
though in fact the world is more diverse nowadays. Inform 7 has always
generated "object code" which is itself a program for a virtual machine;
for example, it makes Glulx bytecode rather than x86 or ARM instructions.
Because of that, we use the customary term "virtual machine" for the format
of the end product of the Inform build process. But it doesn't have to be
virtual. If Inter-to-x86-via-C is properly implemented, we will probably
want to add a VM to represent something like "32-bit binary via ANSI C".
@h Target VMs.
For a fuller explanation of these, see //What This Module Does//, but briefly:
a //target_vm// object represents a choice of both Inter architecture and
also a format for final code-generation from Inter. For example, it might
represent "16-bit with debugging enabled to be generated to Inform 6 code",
or, say, "32-bit to be generated to ANSI C code".
Each different target VM is represented by one of these objects:
=
typedef struct target_vm {
struct text_stream *family_name; /* such as |Glulx| */
int with_debugging_enabled;
struct inter_architecture *architecture; /* such as 32d */
struct semantic_version_number version; /* such as 0.8.7 */
struct text_stream *VM_extension; /* canonical filename extension */
struct text_stream *VM_unblorbed_extension; /* such as |z8| */
struct text_stream *VM_blorbed_extension; /* when blorbed up */
struct text_stream *VM_image; /* filename of image for icon denoting VM */
int max_locals; /* upper limit on local variables per stack frame */
struct text_stream *default_browser_interpreter; /* e.g., "Parchment" */
struct text_stream *iFiction_format_name; /* e.g., "zcode": see the Treaty of Babel */
struct text_stream *format_name; /* transpiler format, e.g., "Inform6" or "C" */
struct linked_list *format_options; /* of |text_stream| */
int supports_floating_point;
CLASS_DEFINITION
} target_vm;
@ =
target_vm *TargetVMs::new(text_stream *code, text_stream *nick, semantic_version_number V,
text_stream *image, text_stream *interpreter, text_stream *blorbed, inter_architecture *arch,
int debug, int max_locals, text_stream *iFiction, text_stream *format) {
target_vm *VM = CREATE(target_vm);
VM->family_name = Str::duplicate(code);
VM->version = V;
VM->VM_extension = Str::duplicate(nick);
VM->VM_unblorbed_extension = Str::duplicate(nick);
VM->VM_blorbed_extension = Str::duplicate(blorbed);
VM->VM_image = Str::duplicate(image);
VM->max_locals = max_locals;
VM->default_browser_interpreter = Str::duplicate(interpreter);
VM->architecture = arch;
if (VM->architecture == NULL) internal_error("no such architecture");
VM->with_debugging_enabled = debug;
VM->supports_floating_point = TRUE;
if (Architectures::is_16_bit(VM->architecture)) VM->supports_floating_point = FALSE;
VM->iFiction_format_name = Str::duplicate(iFiction);
VM->format_name = Str::duplicate(format);
VM->format_options = NEW_LINKED_LIST(text_stream);
return VM;
}
@h Standard set.
This is called when the //arch// module starts up; no other architectures
are ever made.
The basic set of possible target VMs is made when the //arch// module starts up:
=
void TargetVMs::create(void) {
/* hat tip: Joel Berez and Marc Blank, 1979, and later hands */
TargetVMs::new(I"Z-Machine", I"z5", VersionNumbers::from_text(I"5"),
I"vm_z5.png", I"Parchment", I"zblorb", Architectures::from_codename(I"16"), FALSE, 15, I"zcode", I"Inform6");
TargetVMs::new(I"Z-Machine", I"z5", VersionNumbers::from_text(I"5"),
I"vm_z5.png", I"Parchment", I"zblorb", Architectures::from_codename(I"16d"), TRUE, 15, I"zcode", I"Inform6");
TargetVMs::new(Architectures::from_codename(I"16"), I"Inform6",
VersionNumbers::from_text(I"5"), I"z5", I"zblorb", I"Parchment", NULL);
TargetVMs::new(Architectures::from_codename(I"16d"), I"Inform6",
VersionNumbers::from_text(I"5"), I"z5", I"zblorb", I"Parchment", NULL);
TargetVMs::new(I"Z-Machine", I"z8", VersionNumbers::from_text(I"8"),
I"vm_z8.png", I"Parchment", I"zblorb", Architectures::from_codename(I"16"), FALSE, 15, I"zcode", I"Inform6");
TargetVMs::new(I"Z-Machine", I"z8", VersionNumbers::from_text(I"8"),
I"vm_z8.png", I"Parchment", I"zblorb", Architectures::from_codename(I"16d"), TRUE, 15, I"zcode", I"Inform6");
TargetVMs::new(Architectures::from_codename(I"16"), I"Inform6",
VersionNumbers::from_text(I"8"), I"z8", I"zblorb", I"Parchment", NULL);
TargetVMs::new(Architectures::from_codename(I"16d"), I"Inform6",
VersionNumbers::from_text(I"8"), I"z8", I"zblorb", I"Parchment", NULL);
/* hat tip: Andrew Plotkin, 2000 */
TargetVMs::new(I"Glulx", I"ulx", VersionNumbers::from_text(I"3.1.2"),
I"vm_glulx.png", I"Quixe", I"gblorb", Architectures::from_codename(I"32"), FALSE, 256, I"glulx", I"Inform6");
TargetVMs::new(I"Glulx", I"ulx", VersionNumbers::from_text(I"3.1.2"),
I"vm_glulx.png", I"Quixe", I"gblorb", Architectures::from_codename(I"32d"), TRUE, 256, I"glulx", I"Inform6");
TargetVMs::new(Architectures::from_codename(I"32"), I"Inform6",
VersionNumbers::from_text(I"3.1.2"), I"ulx", I"gblorb", I"Quixe", NULL);
TargetVMs::new(Architectures::from_codename(I"32d"), I"Inform6",
VersionNumbers::from_text(I"3.1.2"), I"ulx", I"gblorb", I"Quixe", NULL);
TargetVMs::new(I"C", I"c", VersionNumbers::from_text(I"1"),
I"vm_glulx.png", I"", I"", Architectures::from_codename(I"32"), FALSE, 256, I"inform7-c", I"C");
TargetVMs::new(I"C", I"c", VersionNumbers::from_text(I"1"),
I"vm_glulx.png", I"", I"", Architectures::from_codename(I"32d"), TRUE, 256, I"inform7-c", I"C");
/* C support added September 2021 */
TargetVMs::new(Architectures::from_codename(I"32"), I"C",
VersionNumbers::from_text(I"1"), I"c", I"", I"", NULL);
TargetVMs::new(Architectures::from_codename(I"32d"), I"C",
VersionNumbers::from_text(I"1"), I"c", I"", I"", NULL);
}
@h Describing and finding.
This is the longhand form of the VM name:
@ The //target_vm// structure contains two arguably architectural doohickies:
potential limits on the use of floating-point arithmetic or on local variables.
These are indeed currently derived only from the choice of |architecture|, but
we're keeping them here in case there is some day a need for a 32-bit format
with integer-only arithmetic, say.
=
typedef struct target_vm {
struct inter_architecture *architecture; /* such as 32d */
struct semantic_version_number version; /* such as 0.8.7 */
struct text_stream *VM_unblorbed_extension; /* such as |z8| */
struct text_stream *VM_blorbed_extension; /* when blorbed up */
struct text_stream *VM_image; /* filename of image for icon used in the index */
struct text_stream *default_browser_interpreter; /* e.g., "Parchment" */
struct text_stream *iFiction_format_name; /* e.g., "zcode": see the Treaty of Babel */
struct text_stream *transpiler_family; /* transpiler format, e.g., "Inform6" or "C" */
struct text_stream *full_format; /* e.g., "Inform6/32d/v3.1.2" */
int supports_floating_point;
int max_locals; /* upper limit on local variables per stack frame */
struct linked_list *format_options; /* of |text_stream| */
CLASS_DEFINITION
} target_vm;
@ =
target_vm *TargetVMs::new(inter_architecture *arch, text_stream *format,
semantic_version_number V, text_stream *unblorbed, text_stream *blorbed,
text_stream *interpreter, linked_list *opts) {
target_vm *VM = CREATE(target_vm);
VM->version = V;
VM->VM_unblorbed_extension = Str::duplicate(unblorbed);
VM->VM_blorbed_extension = Str::duplicate(blorbed);
VM->default_browser_interpreter = Str::duplicate(interpreter);
VM->architecture = arch;
if (VM->architecture == NULL) internal_error("no such architecture");
if (Architectures::is_16_bit(VM->architecture)) {
VM->supports_floating_point = FALSE;
VM->max_locals = 15;
if (Str::eq(unblorbed, I"z5")) VM->VM_image = I"vm_z8.png";
else VM->VM_image = I"vm_z5.png";
} else {
VM->supports_floating_point = TRUE;
VM->max_locals = 256;
VM->VM_image = I"vm_glulx.png";
}
VM->iFiction_format_name = Str::new();
if (Str::eq(format, I"Inform6")) {
if (Architectures::is_16_bit(VM->architecture)) {
VM->iFiction_format_name = I"zcode";
} else {
VM->iFiction_format_name = I"glulx";
}
} else {
WRITE_TO(VM->iFiction_format_name, "Inform+%S", format);
}
VM->transpiler_family = Str::duplicate(format);
VM->format_options = NEW_LINKED_LIST(text_stream);
VM->full_format = Str::new();
WRITE_TO(VM->full_format, "%S/%S/v%v",
VM->transpiler_family, Architectures::to_codename(VM->architecture), &V);
if (opts) {
text_stream *opt;
LOOP_OVER_LINKED_LIST(opt, text_stream, opts) {
WRITE_TO(VM->full_format, "/%S", opt);
ADD_TO_LINKED_LIST(opt, text_stream, VM->format_options);
}
}
return VM;
}
@ Plumbing is included here to add "options" to a VM's textual description. The
idea is that these allow for the user to specify additional and VM-specific
command-line options (using |-format|) which are then picked up by //final//.
Thus, a request for |-format=C/32d/no-halt/stack=240| would cause a new variant of
|C/32d| to be created which would have the (purely hypothetical) list of
options |I"no-halt", I"stack=240"|. It is then up to the C final code generator
to understand what these mean, if indeed they mean anything.
=
target_vm *TargetVMs::new_variant(target_vm *existing, linked_list *opts) {
return TargetVMs::new(existing->architecture, existing->transpiler_family,
existing->version, existing->VM_unblorbed_extension,
existing->VM_blorbed_extension, existing->default_browser_interpreter, opts);
}
@h To and from text.
First, writing. This is the longhand form of the VM name:
=
void TargetVMs::write(OUTPUT_STREAM, target_vm *VM) {
if (VM == NULL) WRITE("none");
else {
WRITE("%S", VM->family_name);
semantic_version_number V = VM->version;
if (VersionNumbers::is_null(V) == FALSE) WRITE(" version %v", &V);
if (VM->with_debugging_enabled) WRITE(" with debugging");
}
else WRITE("%S", VM->full_format);
}
@ Here we deduce a VM from the given filename extension, which is the rather
clumsy way that VMs are referred to on the //inform7// command line. For
example, |ulx| produces one of the Glulx VMs.
text_stream *TargetVMs::get_full_format_text(target_vm *VM) {
if (VM == NULL) internal_error("no VM");
return VM->full_format;
}
@ And now for reading. The following is used by //inbuild// when reading the
command-line option |-format=T|: the text |T| is supplied as a parameter here.
Note however that it actually calls //TargetVMs::find_with_hint//. The |debug|
hint, if set, says to make the architecture have debugging enabled or not according
to this hint: thus |"C"| plus the hint |FALSE| will return the VM |C/32|, while
|"C"| plus the hint |TRUE| will return the VM |C/32d|. The hint |NOT_APPLICABLE|
is ignored; and the hint is also ignored if the supplied text already definitely
specifies debugging. Thus |"C/32d"| plus hint |FALSE| will return |C/32d|.
=
target_vm *TargetVMs::find_by_extension(text_stream *ext, int debug) {
target_vm *TargetVMs::find(text_stream *format) {
return TargetVMs::find_with_hint(format, NOT_APPLICABLE); /* i.e., no hint */
}
target_vm *TargetVMs::find_with_hint(text_stream *format, int debug) {
if (Str::len(format) == 0) format = I"Inform6";
text_stream *wanted_language = NULL;
inter_architecture *wanted_arch = NULL;
semantic_version_number wanted_version = VersionNumbers::null();
linked_list *wanted_opts = NEW_LINKED_LIST(text_stream);
@<Parse the text supplied into these variables@>;
if ((wanted_arch) && (Architectures::debug_enabled(wanted_arch))) debug = TRUE;
@<Try to find a VM which is a perfect match@>;
@<Try to find a VM which would be a match except for the options@>;
@<Try to find a VM in the now-deprecated old notation@>;
return NULL;
}
@ Format text is a list of criteria divided by slashes:
@<Parse the text supplied into these variables@> =
TEMPORARY_TEXT(criterion)
LOOP_THROUGH_TEXT(pos, format) {
if (Str::get(pos) == '/') {
if (Str::len(criterion) > 0) @<Accept criterion@>;
Str::clear(criterion);
} else {
PUT_TO(criterion, Str::get(pos));
}
}
if (Str::len(criterion) > 0) @<Accept criterion@>;
DISCARD_TEXT(criterion)
@ The first criterion is the only compulsory one, and must be something like
|Inform6| or |C|. After that, any criterion in the form of an architecture code,
like |32d|, is interpreted as such; and any criterion opening with |v| plus a
digit is read as a semantic version number. If any criteria are left after all
that, they are considered options (see above).
@<Accept criterion@> =
if (wanted_language == NULL) wanted_language = Str::duplicate(criterion);
else {
inter_architecture *arch = Architectures::from_codename(criterion);
if (arch) wanted_arch = arch;
else {
if (((Str::get_at(criterion, 0) == 'v') || (Str::get_at(criterion, 0) == 'V')) &&
(Characters::isdigit(Str::get_at(criterion, 1)))) {
Str::delete_first_character(criterion);
wanted_version = VersionNumbers::from_text(criterion);
} else {
ADD_TO_LINKED_LIST(Str::duplicate(criterion), text_stream, wanted_opts);
}
}
}
@<Try to find a VM which is a perfect match@> =
target_vm *result = NULL;
target_vm *VM;
LOOP_OVER(VM, target_vm)
if ((Str::eq_insensitive(VM->transpiler_family, wanted_language)) &&
((wanted_arch == NULL) || (VM->architecture == wanted_arch)) &&
((debug == NOT_APPLICABLE) || (TargetVMs::debug_enabled(VM) == debug)) &&
(TargetVMs::versions_match(VM, wanted_version)) &&
(TargetVMs::options_match(VM, wanted_opts)))
result = VM;
if (result) return result;
@ If we're given, say, |C/32d/no-pointer-nonsense| and we can't find that exact
thing, but can find |C/32d|, then we construct a variant of it which does have
the option |no-pointer-nonsense| and return that.
@<Try to find a VM which would be a match except for the options@> =
target_vm *result = NULL;
target_vm *VM;
LOOP_OVER(VM, target_vm)
if ((Str::eq_insensitive(VM->transpiler_family, wanted_language)) &&
((wanted_arch == NULL) || (VM->architecture == wanted_arch)) &&
((debug == NOT_APPLICABLE) || (TargetVMs::debug_enabled(VM) == debug)) &&
(TargetVMs::versions_match(VM, wanted_version)))
result = VM;
if (result) return TargetVMs::new_variant(result, wanted_opts);
@ If we get here, we've failed to make any match using the modern notation.
So next we try to deduce a VM from the given filename extension, which is the
clumsy way that VMs used to be referred to on the //inform7// command line. For
example, |-format=ulx| produces |Inform6/32| or |Inform6/32d| (depending on
the |debug| hint).
=
@<Try to find a VM in the now-deprecated old notation@> =
target_vm *result = NULL;
if (Str::len(ext) == 0) ext = I"ulx";
TEMPORARY_TEXT(file_extension)
Str::copy(file_extension, ext);
Str::copy(file_extension, format);
if (Str::get_first_char(file_extension) == '.')
Str::delete_first_character(file_extension);
LOOP_THROUGH_TEXT(pos, file_extension)
Str::put(pos, Characters::tolower(Str::get(pos)));
target_vm *VM;
LOOP_OVER(VM, target_vm)
if ((Str::eq_insensitive(VM->VM_unblorbed_extension, ext)) &&
(VM->with_debugging_enabled == debug))
if ((Str::eq_insensitive(VM->VM_unblorbed_extension, file_extension)) &&
(TargetVMs::debug_enabled(VM) == debug))
result = VM;
DISCARD_TEXT(file_extension)
return result;
}
if (result) {
WRITE_TO(STDOUT, "(-format=%S is deprecated: try -format=%S/%S instead)\n",
format, result->transpiler_family,
Architectures::to_codename(result->architecture));
return result;
}
@ A somewhat sharper method finds specific versions: for example, it can pick
out version 5 rather than version 8 of the Z-machine. Note that the version
numbers must match exactly, and not simply be compatible according to semver
rules.
@ Semantic version rules apply if the user supplies a format text with a given
version requirement. If the user asks for |v3.1.0| and we've got |v3.1.2|,
no problem: there's a match. But |v2.9.3| or |3.2.1| would not match.
=
target_vm *TargetVMs::find_in_family(text_stream *family, semantic_version_number V,
int debug) {
target_vm *VM;
LOOP_OVER(VM, target_vm)
if ((Str::eq_insensitive(VM->family_name, family)) &&
(VersionNumbers::eq(VM->version, V)) &&
((debug == NOT_APPLICABLE) || (debug == VM->with_debugging_enabled)))
return VM;
return NULL;
int TargetVMs::versions_match(target_vm *VM, semantic_version_number wanted) {
if (VersionNumbers::is_null(wanted)) return TRUE;
if (VersionNumberRanges::in_range(VM->version,
VersionNumberRanges::compatibility_range(wanted))) return TRUE;
return FALSE;
}
@ And a device for discovering (or making) a target VM given a more general
format,
=
target_vm *TargetVMs::find(text_stream *format, int debug) {
text_stream *wanted = NULL;
inter_architecture *wanted_arch = NULL;
linked_list *segs = NEW_LINKED_LIST(text_stream);
TEMPORARY_TEXT(segment)
LOOP_THROUGH_TEXT(pos, format) {
if (Str::get(pos) == '/') {
if (Str::len(segment) > 0) @<Accept segment@>;
Str::clear(segment);
}
}
if (Str::len(segment) > 0) @<Accept segment@>
DISCARD_TEXT(segment)
target_vm *result = NULL;
target_vm *VM;
LOOP_OVER(VM, target_vm)
if ((Str::eq_insensitive(VM->format_name, wanted)) &&
((wanted_arch == NULL) || (VM->architecture == wanted_arch)) &&
(VM->with_debugging_enabled == debug) &&
(TargetVMs::options_match(VM, segs)))
result = VM;
if (result) return result;
LOOP_OVER(VM, target_vm)
if ((Str::eq_insensitive(VM->format_name, wanted)) &&
((wanted_arch == NULL) || (VM->architecture == wanted_arch)) &&
(VM->with_debugging_enabled == debug))
result = VM;
if (result) {
target_vm *new_VM = TargetVMs::new(result->family_name, result->VM_extension, result->version,
result->VM_image, result->default_browser_interpreter, result->VM_blorbed_extension, result->architecture,
result->with_debugging_enabled, result->max_locals, result->iFiction_format_name, result->format_name);
new_VM->format_options = segs;
return new_VM;
}
result = TargetVMs::find_by_extension(format, debug);
if (result) {
WRITE_TO(STDOUT, "(warning: that use of -format is deprecated: try -format=%S/%S instead)\n",
result->format_name, Architectures::to_codename(result->architecture));
}
return result;
}
@<Accept segment@> =
if (wanted == NULL) wanted = Str::duplicate(segment);
else {
inter_architecture *arch = Architectures::from_codename(segment);
if (arch) wanted_arch = arch;
else {
ADD_TO_LINKED_LIST(Str::duplicate(segment), text_stream, segs);
}
}
@
@ That just leaves how to tell whether or not a VM has exactly the right options,
given that (a) there can be any number of them, including 0, and (b) they can
be specified in any order. Speed is unimportant here: in effect we test whether
two lists of options give rise to sets which are subsets of each other.
=
int TargetVMs::options_match(target_vm *VM, linked_list *supplied) {
@ -220,27 +295,24 @@ int TargetVMs::ll_of_text_is_subset(linked_list *A, linked_list *B) {
return TRUE;
}
@h Miscellaneous provisions.
@h Architectural provisions.
=
int TargetVMs::is_16_bit(target_vm *VM) {
if (VM == NULL) internal_error("no VM");
return Architectures::is_16_bit(VM->architecture);
}
int TargetVMs::debug_enabled(target_vm *VM) {
if (VM == NULL) internal_error("no VM");
return Architectures::debug_enabled(VM->architecture);
}
int TargetVMs::supports_floating_point(target_vm *VM) {
if (VM == NULL) internal_error("no VM");
return VM->supports_floating_point;
}
@ The limits on local variables per routine are different on each platform.
On Z, the maximum is fixed at 15, but Glulx allows it to be set with an I6
memory setting.
=
int TargetVMs::allow_this_many_locals(target_vm *VM, int N) {
if (VM == NULL) internal_error("no VM");
if ((VM->max_locals >= 0) && (VM->max_locals < N)) return FALSE;
@ -252,11 +324,19 @@ int TargetVMs::allow_MAX_LOCAL_VARIABLES(target_vm *VM) {
return FALSE;
}
@ When releasing a blorbed story file, the file extension depends on the
@h File extension provisions.
The normal or unblorbed file extension is just a hint for what would make a
natural filename for our output: for example, |py| would be a natural choice
for a Python VN, if there were one.
When releasing a blorbed story file, the file extension used depends on the
story file wrapped inside. (This is a dubious idea, in the opinion of
the author of Inform -- should not "blorb" be one unified wrapper? -- but
that ship seems to have sailed.)
Note that for VMs not using Inform 6, blorbing is essentially meaningless,
and then the blorbed extension may be the empty text.
=
text_stream *TargetVMs::get_unblorbed_extension(target_vm *VM) {
if (VM == NULL) internal_error("no VM");
@ -272,6 +352,10 @@ text_stream *TargetVMs::get_blorbed_extension(target_vm *VM) {
where it's not meaningful to talk about debugging features or the number
of bits, and where it's currently not possible to express a VM version number.
It's also unclear what to write to this if we're compiling, say, an Inform 7
source text into C: the Treaty of Babel is unclear on that. For now, we write
|Inform7+C|.
=
text_stream *TargetVMs::get_iFiction_format(target_vm *VM) {
if (VM == NULL) internal_error("no VM");
@ -284,11 +368,43 @@ inter_architecture *TargetVMs::get_architecture(target_vm *VM) {
}
@ Different VMs have different in-browser interpreters, which means that
Inblorb needs to be given different release instructions for them. If the
user doesn't specify any particular interpreter, she gets:
//inblorb// needs to be given different release instructions for them. If the
user doesn't specify any particular interpreter, she gets the following.
On some platforms this will make no sense, and in those cases the function
will return the empty text.
=
text_stream *TargetVMs::get_default_interpreter(target_vm *VM) {
if (VM == NULL) internal_error("no VM");
return VM->default_browser_interpreter;
}
@h Family compatibility.
This is used when, for example, source text headings are said to be "for
Glulx only". How are we to interpret that? The full story is at //Compatibility//,
but here we do at least match whether a given |VM| is, or is not, "Glulx"
(or whatever may be).
=
text_stream *TargetVMs::family(target_vm *VM) {
if (VM == NULL) internal_error("no VM");
return VM->transpiler_family;
}
int TargetVMs::compatible_with(target_vm *VM, text_stream *token) {
if (Str::eq_insensitive(token, I"Glulx")) {
if ((Str::eq_insensitive(VM->transpiler_family, I"Inform6")) &&
(TargetVMs::is_16_bit(VM) == FALSE))
return TRUE;
return TRUE;
}
if (Str::eq_insensitive(token, I"Z-Machine")) {
if ((Str::eq_insensitive(VM->transpiler_family, I"Inform6")) &&
(TargetVMs::is_16_bit(VM) == TRUE))
return TRUE;
return TRUE;
}
if (Str::eq_insensitive(VM->transpiler_family, token)) return TRUE;
return FALSE;
}

View file

@ -16,45 +16,60 @@ uses a module of utility functions called //foundation//.
For more, see //foundation: A Brief Guide to Foundation//.
@h Architecture versus VM.
The Inform 7 build process ultimately wants to make code for some target
virtual machine -- traditionally, the Z or Glulx machines. But it does this
in two stages: first generating abstract Inter code, then further generating
VM code from that.
The Inform 7 build process works in two stages: first it generates abstract
Inter code, then it further generates "final code" from that.
It's an appealing notion that this first stage might be VM-independent: that
It's an appealing notion that this first stage might be universal: that
is, that //inform7// could generate the same Inter code regardless of the
final VM, and that only the second stage would vary according to target.
And this is nearly true, but not quite. There are (currently) two reasons
why not:
eventual build product needed, and that only the second stage would vary
according to this.
Which is very nearly true, but not quite. Here's why not:
(a) //inform7// has to generate different code if integers are 16 rather
than 32 bits wide, and
(b) it also generates different code with debugging enabled than without.
(b) kits of Inter code normally used in compilation make certain other
architectural assumptions based on the integer size (for example, the
assembly-language syntax and semantics are different in these cases);
(c) it also generates different code with debugging enabled than without.
Reason (b) could be avoided, at some cost in complexity, but reason (a) is
something we cannot sensibly avoid without making Inter a much higher-level
Reason (c) could be avoided, at some cost in complexity, but reasons (a) and (b)
are something we cannot sensibly avoid without making Inter a much higher-level
form of bytecode. Instead, we have "architectures" for Inter: for example,
32-bit with debugging enabled is the |32d| architecture. See //Architectures//;
if ever we introduce a 64-bit VM, that will need new architectures, and
this is where they would go.
@ A //target_vm// object, on the other hand, represents an actual choice of
virtual machine. For example, Glulx is a //target_vm//. The compilation
process thus involves a combination of both architecture and target:
= (text as BoxArt)
Source text -----------> Inter code --------------> Bytecode for
INFORM7 for architecture via INFORM6 target virtual machine
=
Each VM can be used with just one architecture: use the function
//TargetVMs::get_architecture// to obtain this. It might seem reasonable
to say that Glulx ought to be viable with both |32| and |32d| architectures,
but in fact "Glulx" is not a single virtual machine but a family of them.
A specific member of this family would be the //target_vm// representing
Glulx version 3.1.2 with debugging enabled, and that can be used with the
|32d| but not the |32| architecture.
@ A //target_vm// object, on the other hand, expresses the choices made at
the second stage too. The term "VM" is traditional here, and stands for
"virtual machine", because until 2021, Inform could only generate code which
would ultimately run on virtual machines called Glulx and the Z-machine. But it
can now, for example, also generate C.
There can in principle be numerous VMs in any given family; see
//TargetVMs::find_in_family// to obtain family members with given behaviour,
and in general see //Target Virtual Machines// for more.
As a result, "VM" now has a more general meaning, and really means "form of
final code generation". The Glulx format used to be specified by supplying the
command-line option |-format=ulx| to //inform7// or //inter//: that still works,
though it is deprecated, and |-format=Inform6/32d| is better. But equally
possible now would be |-format=C/32d|. Here the target is a native executable
to be compiled with a C compiler.
As these new-style |-format| options suggest, the compilation process thus
involves a combination of both architecture and target:
= (text as BoxArt)
depends on architecture: depends on target:
Source text -----------> Inter code ----------------> Bytecode for
INFORM7 via INFORM6 target virtual machine
----------------> Executable
via CLANG/GCC
...
=
Note that a single //target_vm// object can be used with just one architecture:
use the function //TargetVMs::get_architecture// to obtain this. If a target supports
multiple architectures, then there will be multiple //target_vm// objects for it,
one for each architecture it supports. For example, the Glulx VM can be reached
by |Inform6/32| or |Inform6/32d|. There can also be multiple versions: for example,
|Inform6/16/v8| is a valid target. The function //TargetVMs::find// finds the
//target_vm// object associated with a given textual form like |"C/32d"|, if
the toolchain supports this.
@h Compatibility.
Not all software in the Inform stack -- source text from the user, extensions,

View file

@ -1,15 +1,15 @@
Size of lexicon: 3099 excerpt meanings
Stored among 839 words out of total vocabulary of 10560
709 words have a start list: longest belongs to report (with 293 meanings)
15 words have an end list: longest belongs to case (with 6 meanings)
29 words have a middle list: longest belongs to to (with 4 meanings)
Size of lexicon: 3036 excerpt meanings
Stored among 797 words out of total vocabulary of 10559
670 words have a start list: longest belongs to report (with 293 meanings)
11 words have an end list: longest belongs to case (with 6 meanings)
29 words have a middle list: longest belongs to is (with 4 meanings)
108 words have a subset list: longest belongs to street (with 4 meanings)
Number of attempts to retrieve: 106254
of which unsuccessful: 88639
of which successful: 17615
Number of attempts to retrieve: 105334
of which unsuccessful: 87854
of which successful: 17480
Total attempts to match against excerpt meanings: 253776
of which, total with incorrect hash codes: 231757
of which, total with correct hash codes: 22019
of which, total which matched: 19285
Total attempts to match against excerpt meanings: 252880
of which, total with incorrect hash codes: 231032
of which, total with correct hash codes: 21848
of which, total which matched: 19130

View file

@ -1,12 +1,12 @@
adjective: 137 items
adjective: 133 items
article: 2 items
noun: 2380 items
noun: 2360 items
pronoun: 8 items
preposition: 273 items
determiner: 22 items
verb: 108 items
verb_form: 386 items
total in all categories: 3316
total in all categories: 3292
adjective: 'even'
adjective: 'odd'
@ -31,10 +31,6 @@ adjective: 'one-to-one'
adjective: 'one-to-various'
adjective: 'various-to-one'
adjective: 'various-to-various'
adjective: 'infinite'
adjective: 'finite'
adjective: 'nonexistent'
adjective: 'existent'
adjective: 'worn'
adjective: 'carried'
adjective: 'held'
@ -222,26 +218,6 @@ noun: proper: 'printed plural name'
noun: proper: 'property printed plural name'
noun: proper: 'indefinite article'
noun: proper: 'property indefinite article'
noun: proper: 'abs function'
noun: proper: 'root function'
noun: proper: 'rsqr function'
noun: proper: 'ceiling function'
noun: proper: 'floor function'
noun: proper: 'int function'
noun: proper: 'log function'
noun: proper: 'exp function'
noun: proper: 'sin function'
noun: proper: 'cos function'
noun: proper: 'tan function'
noun: proper: 'arcsin function'
noun: proper: 'arccos function'
noun: proper: 'arctan function'
noun: proper: 'sinh function'
noun: proper: 'cosh function'
noun: proper: 'tanh function'
noun: proper: 'arcsinh function'
noun: proper: 'arccosh function'
noun: proper: 'arctanh function'
noun: proper: 'adaptive text viewpoint'
noun: proper: 'property adaptive text viewpoint'
noun: proper: 'description'